【问题标题】:mongoid save embedded documentsmongoid 保存嵌入文档
【发布时间】:2011-11-11 18:49:49
【问题描述】:

我正在尝试基于 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

然后我有我的事件视图,我可以在其中创建事件并将其链接到一个地点。但我想成为 abe 从事件视图/模型中创建课程。

所以我使用fields_for 生成一个链接到课程模型的字段。

= 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

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

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

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

【问题讨论】:

  • 您能否发布用于创建事件的确切代码,包括参数? extract_id 是 Mongoid::Criteria 中的一个方法。
  • 我已经用控制器信息(创建和更新)编辑了问题,其中操作失败。正如您所提到的,我还更正了字段名称,但它仍然无法正常工作:(
  • 快速提问,嵌入文档应该有一个id吗? "课程"=>{"名称"=>"测试名称课程", course_id="xxxxxxxxxxxx"}
  • 嵌入式课程数组将包含嵌入式集合中每个课程的 id -- 由 Mongodb/Mongoid 分配
  • 所以如果我在错误页面上得到这个,这正常吗? gist.github.com/1361107

标签: ruby-on-rails-3 mongoid


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    • 您能否发布用于创建事件的确切代码,包括参数?

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

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

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

    这应该是:

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

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


    如果'nested_form' gem适合你,你可能想试试

    安装 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

    【讨论】:

      【解决方案3】:

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

      :(

      【讨论】:

        【解决方案4】:

        请在模型 event.rb 中包含以下代码

        **accepts_nested_attributes_for :lessons**
        

        这将解决您的问题

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多