在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,这为我遇到的类似问题提供了解决方案。