我正在尝试从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行时,一切正常。但后来我不知道如何保存嵌套文档的值。
答案 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中引用)
您也可以查看:
答案 2 :(得分:0)
这个故事的结论是...... 我删除了与mongoid_slug相关的所有内容,它开始工作了。 然后我把所有东西都放回原处,试图找出如何让它与mongoid_slug一起工作,它就像开箱即用一样。
:(