Учитывая следующие модели:
class Company
include Mongoid::Document
has_many :workers, autosave: true
accepts_nested_attributes_for :workers
attr_accessible :workers_attributes
end
class Worker
include Mongoid::Document
field :hours
attr_accessible :hours
belongs_to :company
end
class Manager < Worker
field :order
has_many :contributors, :class_name => "Worker"
attr_accessible :order, :contributors
end
class Contributor < Worker
field :task
belongs_to :manager, :class_name => "Worker"
attr_accessible :task
end
Как создать менеджера в компании в контроллере и просматривать с использованием вложенных атрибутов?
Вот мое предположение:
def new
@company = Company.new
@company.workers = [Manager.new]
end
def create
@company = Company.new params[:user]
if @company.save
redirect_to root_url, :notice => "Company with manager created."
else
render :new
end
end
= semantic_form_for @company do |f|
= f.semantic_fields_for :workers do |worker_fields|
= worker_fields.inputs do
= worker_fields.input :hours
= worker_fields.input :order
проблема в том, что поле заказа, которое принадлежит менеджеру, не сохраняется после создания. Также, когда данные заполнены неправильно, возникает ошибка:
undefined method `order' for #<Worker:0x0000000646f018> (ActionView::Template::Error)
Так есть ли способ для вложенных атрибутов обрабатывать наследование в моделях из mongoid?
Вопрос связан с Можно ли использовать вложенные атрибуты в сочетании с наследованием? за исключением случаев, когда вместо активной записи используется mongoid.
Честно говоря, это перефразирование моего кода ... настоящий код - более сложная ситуация, хотя я считаю, что это все соответствующие части. Если у вас есть еще вопросы, задавайте.
UPDATE:
Я изменил вид на следующее:
= semantic_form_for @company do |f|
- @company.workers.each do |worker|
- if worker._type == "Manager"
= f.semantic_fields_for :workers, worker do |worker_fields|
= worker_fields.inputs do
= worker_fields.input :hours
= worker_fields.input :order
Я больше не получаю сообщение об ошибке, однако вложенные атрибуты не обновляют объект компании должным образом. Параметры следующие:
{"company"=> {"workers_attributes"=>{"0"=>{"hours"=>"30", "order" => "fish", "id"=>"4e8aa6851d41c87a63000060"}}}}
Снова отредактировано для краткости. Таким образом, ключевая часть заключается в том, что существует хеш между "0" => {данные для менеджера}. Рабочие данные, похоже, хранятся в хеше. Я ожидаю, что данные будут выглядеть примерно так:
params = { company => {
workers_attributes => [
{ hours => "30", "order" => "fish" }
]}}
Это отличается тем, что рабочие данные хранятся в массиве, а не в хэше. Есть ли еще один шаг для правильного сохранения вложенных атрибутов?
Спасибо