Заполнение унаследованного документа mongoid с использованием вложенных атрибутов - PullRequest
1 голос
/ 03 октября 2011

Учитывая следующие модели:

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" }
    ]}}

Это отличается тем, что рабочие данные хранятся в массиве, а не в хэше. Есть ли еще один шаг для правильного сохранения вложенных атрибутов?

Спасибо

1 Ответ

1 голос
/ 03 октября 2011

какую версию Mongoid вы используете?Потому что я не думаю, что использование refereneces_many приветствуется - не то, что это связано с вашей проблемой здесь, просто хотел выяснить, какую версию вы используете.Получите это в документе на великолепном Mongoid.org, мне пришлось научиться этому нелегко, говорят, что для обновления ваших записей вам нужно, чтобы для автосохранения было установлено значение true.Это НЕ точно.Это нужно даже для создания

, поэтому:

class Company
  include Mongoid::Document

  has_many :workers, :autossave => true # your money shot
  accepts_nested_attributes_for :workers
  attr_accessible :workers_attributes
end

ДОБАВЛЕНО:

Я перечитывал ваш код, я обнаружил следующее, что может быть проблемой:Модель компании имеет значение has_many: worker и настроена на прием вложенных атрибутов для Worker при внесении изменений, верно?И в вашей модели менеджера есть поле с именем Order, которое является подклассом от Worker.Тем не менее, у вас есть форма, часть вложенных полей которой указана на Worker, а не на Manager, модель, которая фактически имеет поле Order.И этого, очевидно, недостаточно, поскольку в компании еще нет -many: менеджеров, возможно, вам также потребуется установить значение has_many: менеджеры в модели Company.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...