Sinatra + Mongoid更新嵌入式文档
问题描述:
我遇到问题更新文档及其嵌入式文档一起去Sinatra 1.4.4和Mongoid 3.1.5。就目前而言,嵌入式文档不会被修改,只需要嵌套的属性并将它们添加到父级别。Sinatra + Mongoid更新嵌入式文档
假设:
给定的形式,如:
<form action="/persons/edit/52cad9f0d2a57d2ded000070 method="post">
<input name="name" value="Some Guy" />
<input name="address[street]" value="Evergreen Street" />
<button type="submit">Save</button>
</form>
的模型,如:
class Person
include Mongoid::Document
include Addressable
accepts_nested_attributes_for :address
field :name, type: String
end
class Addressable
extend ActiveSupport::Concern
included do
embeds_one :address, class_name: 'Address', cascade_callbacks: true
end
end
class Address
include Mongoid::Document
field :street, type: String
before_save :strip_whitespace
def remove_whitespace
attributes.each do |attr_name, value|
next unless value.is_a? String
send("#{attr_name}=", value.strip.gsub(/\s(\s+)/, ' '))
end
end
end
的文件,如:
{
name: "Default Name",
address: {
_id: ObjectId("52fc501f266d9841d000007c"),
street: "Default Street"
},
}
最后,一路线如下:
post '/persons/edit/:id' do |id|
p = Persons.find(id)
p.update_attributes params
end
结果
我希望文档落得为:
{
name: "Some Guy", //this is okay
address: {
_id: ObjectId("52fc501f266d9841d000007c"),
street: "Evergreen Street"
}
}
而是使用结束:
{
name: "Some Guy", //this is okay
address: {
_id: ObjectId("52fc501f266d9841d000007c"),
street: "Default Street" //not changed
},
street: "Evergreen Street" //WTF?
}
我知道我做错了什么,但对于我的生活,我看不到什么。我发现奇怪的是,如果我将表单上的name
属性从使用括号更改为点(例如address.street
),则更新可行,但Sinatra不会将该参数识别为Hash
,而只是整个params
中的一个键。
有关如何解决此问题的任何想法?我错过了什么吗?
感谢您的帮助!
答
我想,你没有指定embedded_in
关系的问题在Address
文件中。 我建议你使用polymorphic
行为的常用做法 - http://mongoid.org/en/mongoid/docs/relations.html#common(多态)
将试试这个并报告回来,谢谢你的提示! – Roberto
这很好,我想我应该更仔细地阅读文档。德米特里,谢谢你! – Roberto