在Rails表单中处理MongoMapper EmbeddedDocument

首先,我是一般编程和Rails的新手。 我选择了Rails,因为它似乎是一种简单的语言。 对于我的项目,我正在使用带有Rails的MongoMapper。

我正在尝试以与文档相同的forms处理嵌入式文档。

我有以下型号:

class User include MongoMapper::Document key :email, String, :required => true key :first_name, String key :last_name, String key :role, String many :addresses timestamps! end class Address include MongoMapper::EmbeddedDocument key :location, String key :street, String key :city, String key :zip, Integer key :state, String key :country, String end 

我想在Document的同时创建/编辑EmbeddedDocument。 我尝试过使用fields_for:

  

但我明白了

#l \:Array:0x0000010126e3f8>的未定义方法`street’

先感谢您。

如果在User上定义addresses_attributes= ,则fields_for将起作用。 出于某种原因,如果您定义该方法, fields_for实际上会更改其行为。

这是一个示例实现:

 def addresses_attributes=(id_and_attrs) id_and_attrs.each do |id, attrs| address = self.addresses.find(id) || self.addresses.build(:id => id) address.attributes = attrs end end 

未经测试,所以你必须弄清楚扭结。 特别是,我不记得如果地址是全新的,因为用户是新的,嵌套参数是如何通过不同的方式通过的。

据我所知,fields_for不包含对象的id,为此你需要添加一个隐藏的字段。

 <%= address.hidden_field :id, :value => address.object.id %> 

那么你的addresses_attributes =方法将如下所示:

 def addresses_attributes=(addresses_attributes) addresses_attributes.each do |index, attrs| address = self.addresses.find(attrs['id']) || self.addresses.build address.attributes = attrs end end 

谢谢Brian,这为我遇到的类似问题提供了解决方案。