Полиморфизм и формы в Ruby on Rails - PullRequest
3 голосов
/ 25 июля 2010

В последнее время у меня полно вопросов, но благодаря этому удивительному сообществу я изучаю тонну.

Раньше я получал всю необходимую помощь с полиморфными ассоциациями, и теперь у меня есть вопрос о работе с формами с полиморфными моделями. Например, у меня есть Phoneable и User, поэтому, когда я создаю свою форму для регистрации пользователя, я хочу иметь возможность назначить пользователю несколько телефонных номеров (например, сотовый, рабочий, домашний).

class User < ActiveRecord::Base
  has_many :phones, :as => :phoneable
end

class Phone < ActiveRecord::Base
  belongs_to :phoneable, :polymorphic => true
end

class CreateUsers < ActiveRecord::Migration
  t.column :name, :string
  t.references :phoneable, :polymorphic => true
end

class CreatePhones < ActiveRecord::Migration
  t.column :area_code, :integer
  t.column :number, :integer
  t.column :type, :string
  t.references :phoneable, :polymorphic => true
end

Теперь, когда я создаю свою форму, я запутался. Обычно я делал бы следующее:

- form_for :user, :html => {:multipart => true} do |form|
  %fieldset
    %label{:for => "name"} Name:
    = form.text_field :name
    ##now how do I go about adding a phone number?
    ##typically I'd do this:
    ##%label{:for => "phone"} Phone:
    ##= form.text_field :phone

Используя полиморфизм, я бы просто подошел к тому же пути, но использовал бы fields_for?

- user_form.fields_for :phone do |phone| %>
  %label{for => "area_code"} Area Code:
  = phone.text_field :area_code
  %label{for => "number"} Number:
  = phone.text_field :number

Это правильный подход в данном случае?

1 Ответ

7 голосов
/ 25 июля 2010

Прежде чем мы пойдем дальше, я заметил одну проблему - вам не нужен t.references со стороной has_many ассоциации.Так что вам это не нужно в модели create_user.Он создает столбцы phonable_id и phoneable_type, которые вам нужны только в полиморфной модели.

Вы идете по правильному пути с подходом fields_for.Но для того, чтобы это работало, вам нужно указать модели, как обрабатывать эти поля.Вы делаете это с помощью accepts_nested_attributes_for метода класса.

class User < ActiveRecord::Base
  has_many :phones, :as => :phoneable

  accepts_nested_attributes_for :phones
end

и одной второстепенной вещи, вам нужно будет указать fields_for на точное имя ассоциации

- form_for @user do |user_form|
  - user_form.fields_for :phones do |phone|

Вместо

- form_for @user do |user_form|
  - user_form.fields_for :phone do |phone|

и убедитесь, что вы удалили блуждающий тег %> erb:)

Подробнее о accepts_nested_attributes_for: http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...