【发布时间】:2014-03-20 11:30:21
【问题描述】:
我在使用 Sinatra 1.4.4 和 Mongoid 3.1.5 一次性更新文档及其嵌入文档时遇到问题。就目前而言,嵌入的文档没有被修改,而只是获取嵌套的属性并将它们添加到父级。
假设:
给定一个形式,例如:
<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内。
关于如何解决这个问题的任何想法?我错过了什么吗?
感谢您帮助我!
【问题讨论】:
标签: ruby sinatra mongoid mongoid3