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(多态)

+0

将试试这个并报告回来,谢谢你的提示! – Roberto

+0

这很好,我想我应该更仔细地阅读文档。德米特里,谢谢你! – Roberto