【问题标题】:Sinatra + Mongoid update embedded documentSinatra + Mongoid 更新嵌入文档
【发布时间】: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


    【解决方案1】:

    我猜,你没有在Address 文档中指定embedded_in 关系的问题。 我建议您对polymorphic 行为使用常见做法 - http://mongoid.org/en/mongoid/docs/relations.html#common(多态性)

    【讨论】:

    • 这很好用,我想我应该更彻底地阅读文档。非常感谢,德米特里!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多