Как заставить устройство работать с accepts_nested_attributes_for в отношениях has one?

Я пытаюсь получить свою пользовательскую форму, чтобы пользователь мог одновременно заполнять профиль своей компании через form_for. По какой-то причине он не показывает поля компании. Вот мой код для контроллера и макетов.

class User < ActiveRecord::Base
  attr_accessible :company_attributes

  has_one :company
  accepts_nested_attributes_for :company
end

class Company < ActiveRecord::Base
  belongs_to :user

  # Validation
  validates :name, :presence => true
end

<%= f.fields_for :company do |company_form| %>
  <div class="field">
    <%= company_form.label :name, "Company Name" %><br />
    <%= company_form.text_field :name %>
  </div>
<% end %>

person Joshua Novak    schedule 24.03.2011    source источник


Ответы (3)


Атрибут company элемента User должен быть не-nil, поэтому либо в контроллере, либо в форме создайте его:

<% user.build_company if user.company.nil? %>
<%= f.fields_for :company do |company_form| %>
...
person Zabba    schedule 24.03.2011
comment
Вероятно, следует сделать это в User#after_initialize - person Mark Richman; 03.07.2012

Возможно, лучше сделать это в модели, а не в представлении или контроллере.

class User
  # Blah blah blah
  def profile
    super || build_profile
  end
end
person sean_j_roberts    schedule 21.06.2012
comment
Спасибо тебе за это! Я работаю с Devise и не знаю, смогу ли я сделать resource.build_profile в RegistrationsController, так что это сработало отлично. - person Ryan Arneson; 28.10.2013

Приведенное выше решение от Zabba работало для меня только с:

<% @user.build_profile if @user.profile.nil? %>

В противном случае представление понятия не имело, что такое «пользователь».

person Sam Rose    schedule 14.10.2011