Rails: accept_nested_attributes_for объяснения

Я использую Mongoid а также rails_admin драгоценный камень для моего применения рельсов. Вот мои два файла модели:

модель Category

class Category
  include Mongoid::Document
  include Mongoid::Timestamps

  field :name, type: String

  embeds_many :tags
  # accepts_nested_attributes_for :tags  # this line will be added later
end

модель Tag

class Tag
  include Mongoid::Document
  field :name, type: String

  embedded_in :category
end

Когда я запускаю страницу администратора (генерируется rails_admin), Я встречаю исключение. В этом исключении есть сообщение скажите мне, что я должен поставить accepts_nested_attributes_for :tag в Category модель. После того, как я поставил эту строку, ошибка не появляется.

Итак, мой вопрос: пожалуйста, объясните мне цель accepts_nested_attributes_for, Я вижу много уроков, часто эти две строки используют вместе:

   embeds_many :tags
  accepts_nested_attributes_for :tags

Так почему же? Почему не только одна строка?

@ Редактировать: я тоже читал эту ссылку. Но я до сих пор не так много понимаю. объяснение

Спасибо:)

1 ответ

Решение

Из документов

Вложенные атрибуты позволяют сохранять атрибуты в связанных записях через родительский элемент. По умолчанию обновление вложенных атрибутов отключено, и вы можете включить его с помощью метода класса #accepts_nested_attributes_for. При включении вложенных атрибутов в модели определяется средство записи атрибутов.

Другими словами, принимает вложенные атрибуты, позволяет сохранять теги непосредственно из модели категории (это рельсы).

С другой стороны, embeds_many добавляет отношение между категорией и тегом (это mongoid). он все равно будет действителен без #accepts_nested_attributes, но не позволит вам сохранить оба в одном шаге от родителя.

Хороший пример этому:

Включение вложенных атрибутов в однозначной ассоциации позволяет вам создать участника и аватар за один раз:

params = { member: { name: 'Jack', avatar_attributes: { icon: 'smiling' } } } 
# both member and avatar passed in one hash
member = Member.create(params[:member])
member.avatar.id # => 2
member.avatar.icon # => 'smiling'

Очень хорошее видео для дальнейшего объяснения концепции можно найти здесь

Другие вопросы по тегам