【发布时间】: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