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'
Очень хорошее видео для дальнейшего объяснения концепции можно найти здесь