开发者

Filling out an inherited mongoid document using nested attributes

Given the following models:

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

How does one create a manager in a company in the controller and view using nested attributes?

Here's my guess:

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

problem is the order field which specifically belongs to the manager is not persisting after the create. Also when the data is improperly filled there is an error:

undefined method `order' for #<Worker:0x0000000646f018> (ActionView::Template::Error)

So is there a way for nested attributes to handle inheritance in the models from mongoid?

开发者_Go百科

The question is related to Can nested attributes be used in combination with inheritance? except instead of active record using mongoid.

Honestly, this is a paraphrasing of my code... the real code is more complex situation although i believe these are all of the relevant parts. If you have more questions ask.

UPDATE:

I changed the view to the following:

= 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

I do not get the error anymore, however the nested attributes do not update the company object properly. The params are the following:

{"company"=> {"workers_attributes"=>{"0"=>{"hours"=>"30", "order" => "fish", "id"=>"4e8aa6851d41c87a63000060"}}}}

Again edited for brevity. So the key part is that there is a hash between "0" => {data for manager}. The workers data seems to be held in a hash. I would expect the data to look more like the following:

params = { company => {
    workers_attributes => [
        { hours => "30", "order" => "fish" }
    ]}}

This is different because the workers data is held in an array instead of a hash. Is there another step to get the nested attributes to save properly?

Thanks


what version of Mongoid are you using? Because I don't think the use of refereneces_many is encouraged -- Not that that's related to your problem here, just wanted to probe what version you're using. In the doc on the gorgeous Mongoid.org, get this, I had to learn it the hard way, they say for Updating your records, you need to the autossave set to true. That's NOT accurate. You need it for even creating

so:

class Company
  include Mongoid::Document

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

ADDED:

I was re-reading your code, I spotted the following that might be the problem: Your Company model is set to has_many :workers and is set to accept nested attribbutes for Worker when changes come in, correct? And there is a field named Order in your Manager model which is subclassed from Worker. Yet you're having a form whose nested fields part is pointed at Worker not at Manager, the model that actually has the Order field. And that's obviously not enough, because Company isn't having_many :managers yet, you may need to set it to has_many :managers in the Company model as well.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜