Вложенные формы в рельсах - доступ к атрибуту в отношении has_many

19

У меня есть пользователь и модель профиля. Один пользователь может иметь много профилей. Мне нужно получить доступ к одной информации из раздела профилей (а именно номер телефона) в моей модели пользователя во время процесса создания пользователя. Поэтому я пытаюсь сделать это через 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? Спасибо.

    
задан Swamy g 12.02.2010 в 02:50
источник
  • Как я уже сказал, я использовал профили f.fields_for: и поля в форме не отображались. Оказывается, мне пришлось добавить @ user.profiles.build в контроллер. Но теперь я не могу иметь как attr_accessible, так и accepts_nested_attributes_for в user.rb. Первое перекрывает последнее. Но я хочу иметь attr_accesible для атрибутов модели пользователя, а не ограничивать доступ к атрибутам модели профиля. Есть идеи? Благодарю. –  Swamy g 13.02.2010 в 19:00

4 ответа

17

Вы можете сделать что-то вроде следующего:

<% 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 '     

ответ дан Pran 12.02.2010 в 06:54
  • Стоит отметить, что это итерация над связанными объектами, которые уже существуют. Однако он не создает новую пустую запись для заполнения. Используйте помощник для того, который добавляет новую запись, если ни одна из них не связана с ассоциацией, например «def setup_profiles (пользователь); user.profiles.build, если user.profiles.blank? ||! User.profiles.map (&: new_record? ) .any ?; user; end ", затем используя" form_for setup_profiles (@user) do ... " –  hurikhan77 13.02.2010 в 15:50
  • @ комментарий hurikhan77 имеет решающее значение! Вам нужно создать новый объект, если не существует связанных объектов, иначе ничего не появится в вашей форме! –  agmin 17.10.2012 в 22:04
12

Вам следует посмотреть RailsCasts Nested Model Form .
спасибо Райан Бейтс отличная работа.

    
ответ дан allenwei 16.02.2010 в 12:32
  • Да, Райан придумал отличное решение. –  jspooner 06.12.2010 в 04:30
2

Ссылка

Этот список ссылок api dock содержит множество примеров вложенных атрибутов, в том числе один-к-одному, один-ко-многим. Это очень полезно!

    
ответ дан ryancheung 28.01.2013 в 10:04
0

Вы можете использовать accepts_nested_attributes_for 'для этого; но в формах есть небольшой трюк:

Вы должны использовать единственное число и вызывать поля для каждого профиля, например:

<% form_for @user do |f| -%>
<% @user.profiles.each do %>
<% f.fields_for :profile_attributes, profile do |ff| -%>
<% end %>

Обратите внимание: : profile_attributes , а не только : профиль .

    
ответ дан nanda 12.02.2010 в 14:38
  • Если это полиморфная ассоциация belongs_to, вы должны определить метод build_profile в своей модели пользователя. –  nanda 12.02.2010 в 14:40