mongoid保存嵌入式文档

时间:2011-11-11 18:49:50

标签: ruby-on-rails-3 mongoid

我正在尝试从railscast构建以下教程: http://railscasts.com/episodes/196-nested-model-form-part-1

我正在努力使一切都与mongodb和mongoid一起工作。

场景是: 我想创建链接到某个位置的事件。每个活动(舞蹈课)都包含许多课程。 所以我认为嵌入式关系是完美的。

以下是我的模特

模型课程

class Lesson
  include Mongoid::Document
  include Mongoid::Slug
  field :name, :type => String

  embedded_in :event

  slug :name
end

模型事件

class Event
  include Mongoid::Document
  include Mongoid::Slug
  include Mongoid::Timestamps
  include Mongoid::MultiParameterAttributes

  field :name, :type => String
  field :description, :type => String
  field :date, :type => DateTime

  validates_presence_of :name

  has_one :venue
  referenced_in :venue
  embeds_many :lessons

  slug :name 
end

模型地点

class Venue
  include Mongoid::Document
  include Mongoid::Slug
  include Mongoid::Timestamps
  include Mongoid::MultiParameterAttributes


  field :name, :type => String
  field :location, :type => String

  validates_presence_of :name, :location

  belongs_to :event

  slug :name
end

事件控制器

def create
  @event = Event.new(params[:event])
    if @event.save
    flash[:notice] = 'Event was successfully created.'
  end
 respond_with(@Event, :location => events_url)
end

def update
  # @event = Event.find(params[:id])
   @event = Event.find_by_slug(params[:id])
   if @event.update_attributes(params[:event])
      flash[:notice] = "Event was succesfully updated"
    end
  respond_with(@event)
end

然后我有我的事件视图,我可以在其中创建事件并将其链接到场地。但是我希望能够从事件视图/模型中创建课程。

所以我使用fields_for生成链接到Lessons模型的字段。

= form_for @event do |f|
  .field
    = f.label :name
    %br/
    = f.text_field :name
  .field
    = f.label :description
    %br/
    = f.text_area :description
  .field
    = f.label :venue_id
    %br/
    = f.collection_select :venue_id, Venue.all, :id, :name
  .field
    = f.label :date
    %br/
    = f.datetime_select :date
  %h3 Add a Class
    = f.fields_for :lessons do |builder|
     = render "lesson_fields", :f => builder
 .actions
    = f.submit 'Save'

当我创建或编辑新事件时,我收到一条错误消息:

undefined method `extract_id' for "test":String

但是错误页面上的请求参数消息在事件文档中显示了我的课程值。

"lessons"=>{"name"=>"test name lesson"}

当我删除fields_for行时,一切正常。但后来我不知道如何保存嵌套文档的值。

3 个答案:

答案 0 :(得分:1)

我对embeds_many有同样的问题,但是当我尝试更改为has_many时。有用!。也许你也可以试试。

答案 1 :(得分:0)

  • 您可以发布用于创建事件的确切代码,包括参数吗?

  • 您使用的是哪个版本的Mongoid和Rails?

我注意到的第一件事是以下参数哈希与您的课程模型不匹配:

"lessons"=>{"content"=>"test name lesson"}   # this looks wrong

这应该是:

"lessons"=>{"name" => "test name lesson"}

看起来您的课程表单的文本输入字段标签错误..它应该是:name ,而不是:content


如果'nested_form'gem 适用于您,可能需要尝试

安装宝石后,请在视图中使用nested_form_for代替form_for

点击此处查看更详细的说明:

How can I handle this type of multi level forms in rails

请参阅:

https://github.com/ryanb/nested_form(它也在你提到的RailsCast中引用)


您也可以查看:

field_for and nested form with mongoid

答案 2 :(得分:0)

这个故事的结论是...... 我删除了与mongoid_slug相关的所有内容,它开始工作了。 然后我把所有东西都放回原处,试图找出如何让它与mongoid_slug一起工作,它就像开箱即用一样。

:(