#ruby-on-rails-3
#ruby-on-rails-3
Вопрос:
Когда я должен использовать «accepts_nested_attributes_for»? В приведенном ниже примере я могу выполнить успешное «user.microposts.create» без использования «accepts_nested_attributes_for» в пользовательской модели.
class Micropost < ActiveRecord::Base
belongs_to :user
end
class User < ActiveRecord::Base
has_many :microposts
end
Ответ №1:
accepts_nested_attributes_for
это просто ярлык. Он определяет динамический атрибут {field_name}_attributes
, так что, если у вас есть форма, вы можете включать вложенные атрибуты и автоматически назначать их ассоциации. Вот так :
form_for :object do |f|
f.text_field :attr1
f.text_field :attr2
f.fields_for :association_attributes do |g|
g.text_field :nested1
g.text_field :nested2
end
end
Это сообщение с параметрами {object: {attr1: val, attr2: val, association_attributes: {nested1: val, nested2: val}}
и добавлением accepts_nested_attributes_for :association
к вашему классу заставляет все это работать без какого-либо дополнительного кода.
Комментарии:
1. Итак, используя вашу форму, но с моим примером и без «accepts_nested_attributes_for», мне пришлось бы дважды вызывать параметры ([:object] и [:object] [:association]) в контроллере?
2. ну, без
accepts_nested_attributes_for
и с этой формой вы бы получили ошибку «Неопределенный метод association_attributes= для object object». Чтобы заставить это работать, вам нужно создать объект изparams[:object].except(:association_attributes)
затем создать ассоциацию изobject.associations.new(params[:object][:association_attributes])
.3. Вам не нужно делать :association_attributes, просто
:association
сaccepts_nested_attributes_for
в вашей модели автоматически будут вызываться атрибутыassociation_attributes
.4. Это правда, вам не нужно
association_attributes
в вызовеaccepts_nested_attribute_for
, но вам это нужно в форме.