2010-02-12 5 views
18

У меня есть пользователь и модель профиля. Один пользователь может иметь много профилей. Мне нужно получить доступ к одной информации из раздела профилей (а именно номер телефона) в моей модели пользователя во время процесса создания пользователя. Поэтому я пытаюсь сделать это через attr_accessible. Мой user.rb выглядит так.Вложенные формы в рельсах - доступ к атрибуту в has_many отношении

has_many :profiles 
attr_accessible :handle, :email, :password, :profile_mobile_number 
attr_accessor : :profile_mobile_number 

Проблема, с которой я столкнулся в том, что, когда я пытаюсь вызвать метод геттер profile_mobile_number в способе в user.rb (метод является частным, хотя я думаю, что это не имеет значения), я m получает нулевое значение. Я использую следующие в моей форме пользователи/new.html.erb

Мой вопрос: что это правильный способ сделать это? Должен ли я использовать <% f.fields_for :profile do |ff| -%> или <% f.fields_for :profiles do |ff| -%> (обратите внимание, что второй является множественным). Когда я использую множественное число: профили, я даже не вижу поля в форме. Что мне здесь не хватает? И какое время нужно использовать в модели user.rb? : profile_phone_number или: profiles_phone_number? Благодарю.

+0

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

ответ

16

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

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

+6

Стоит отметить, что это итерация над связанными объектами, которые уже существуют. Однако он не создает новую пустую запись для заполнения. Используйте помощник для того, который добавляет новую запись, если ни одна из них не связана с ассоциацией, например «def setup_profiles (пользователь); user.profiles.build, если user.profiles.blank? ||! User.profiles.map (&: new_record?) .any ?; user; end ", затем используя" form_for setup_profiles (@user) do ... " – hurikhan77

+1

@ комментарий hurikhan77 имеет решающее значение! Вам нужно создать новый объект, если не существует связанных объектов, иначе ничего не появится в вашей форме! – agmin

0

Вы можете использовать «accepts_nested_attributes_for», чтобы сделать это; но есть маленькая хитрость в формах:

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

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

Обратите внимание, что это : profile_attributes, а не просто : профиль ,

+3

Если это ассоциация * belongs_to polymorphic *, вы должны определить метод * build_profile * в своей модели пользователя. – nanda

Смежные вопросы