2013-02-23 3 views
0

У меня есть модель с примерно 40 полями формы. Затем у меня есть 3 поля в форме, принадлежащей модели Child. Это: возраст, пол: дом.Как сохранить модель с accepts_nested_attributes_for?

Я просмотрел документацию для accepts_nested_attributes_for и немного запутался в том, как сохранить дочернюю модель в базе данных.

В моей UsersController У меня есть следующие:

@user = User.new(params[:user]) 
... 
@user.save 

Теперь в документации Rails они есть модель с именем элемента и внутри него, он has_many: посты и accepts_nested_attributes_for: посты. Они сохранить модель члена, как это:

params = { :member => { 
    :name => 'joe', :posts_attributes => [ 
    { :title => 'Kari, the awesome Ruby documentation browser!' }, 
    { :title => 'The egalitarian assumption of the modern citizen' }, 
    { :title => '', :_destroy => '1' } # this will be ignored 
    ] 
}} 

member = Member.create(params['member']) 

Но у меня уже есть эквивалент Params [:] членов с Params [: пользователя]. Мои поля 3 Child:: age,: gender и: home находятся в params [: age], params [: gender] и params [: home]. Поэтому, я думаю, мой вопрос заключается в том, как сохранить модель пользователя и сохранить 3 дочерних поля в модели Child?

ответ

0

Вам необходимо правильно настроить форму, чтобы использовать accepts_nested_attributes_for.

Так что в вашем User модели, вы будете иметь:

accepts_nested_attributes_for :child 

и в вашей форме, вы можете сделать это:

form_for @user do |f| 
    f.text_field :name #or whatever your user attributes 

    f.fields_for :child, @user.build_child do |child| 
    child.text_field :age 
    #etc 
    end 
end 

Теперь рельсы должны строить child объект как часть user, и вы должны иметь возможность создать объекты user и child за один раз.

ли вы положили child или children для accepts_nested_attributes_for полностью зависит от соотношения между user и child. Если user просто has_one :child, то вышеуказанного должно быть достаточно. Если это has_many отношения, вам необходимо изменить символ :children и изменить @user.build_child к @user.children.build.

Кроме того, не забудьте добавить (child|children)_attributes к вашему attr_accessible на вашей user модели, иначе вы не сможете для массового назначения их посредством подачи формы.

+0

Спасибо @Zajn. Это многое объясняет. Но, по-моему, я оставил большую часть моего вопроса. Эти дочерние поля динамически генерируются в зависимости от того, сколько детей указано пользователем. Итак, тогда я бы сохранил поля Child так? @ user.children.build (возраст: params [: age1], пол: params [: gender1], home: params [: home1]) – mikeglaz

+0

Да, это работает! – mikeglaz