Зачем использовать «accepts_nested_attributes_for», когда вы уже можете сохранять через родительский?

#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 , но вам это нужно в форме.