Вложенные формы в рельсах - доступ к атрибуту в отношении has_many
У меня есть пользователь и модель профиля. Один пользователь может иметь много профилей. Мне нужно получить доступ к одной информации из раздела профилей (а именно номер телефона) в моей модели пользователя во время процесса создания пользователя. Поэтому я пытаюсь сделать это через attr_accessible
. Мой user.rb выглядит так.
has_many :profiles
attr_accessible :handle, :email, :password, :profile_mobile_number
attr_accessor : :profile_mobile_number
Проблема, с которой я столкнулась, заключается в том, что когда я пытаюсь вызвать метод getter profile_mobile_number в методе в user.rb(метод является закрытым, хотя я думаю, что это не имеет значения), я получаю нуль стоимость. Я использую следующее в моей форме users/new.html.erb
Мой вопрос в том, как правильно это сделать? Должен ли я использовать <% f.fields_for :profile do |ff| -%>
или <% f.fields_for :profiles do |ff| -%>
(обратите внимание, что второй является множественным). Когда я использую множественное число: профили, я даже не вижу поля в форме. Что мне здесь не хватает? И какое время нужно использовать в модели user.rb?: profile_phone_number или: profiles_phone_number? Спасибо.
Ответы
Ответ 1
Вы можете сделать что-то вроде следующего:
<% form_for @user, :url => { :action => "update" } do |user_form| %>
...
<% user_form.fields_for :profiles do |profiles_fields| %>
Phone Number: <%= profiles_fields.text_field :profile_mobile_number %>
<% end %>
<% end %>
Но поскольку у вас уже есть ассоциация, тогда также можно использовать 'accepts_nested_attributes_for'
Ответ 2
Вам следует посмотреть RailsCasts вложенная модель.
спасибо Райан Бейтс отличная работа.
Ответ 3
http://apidock.com/rails/v3.2.8/ActionView/Helpers/FormHelper/fields_for
Этот список ссылок api dock содержит множество примеров вложенных атрибутов, в том числе один-к-одному, один-ко-многим. Это очень полезно!
Ответ 4
Вы можете использовать 'accepts_nested_attributes_for' для этого; но там есть небольшой трюк в формах:
Вы должны использовать единственное число и вызывать поля для каждого профиля, например:
<% form_for @user do |f| -%>
<% @user.profiles.each do %>
<% f.fields_for :profile_attributes, profile do |ff| -%>
<% end %>
Обратите внимание: : profile_attributes, а не только : профиль.