2011-04-28 49 views
3

首先,我是一般的新手,而Rails是新手。我选择了Rails,因为它似乎是一种简单的语言。对于我的项目,我正在使用MongoMapper和Rails。以Rails的形式处理MongoMapper嵌入式文档

我正在尝试使用与Document相同的格式处理嵌入式文档。

我有以下型号:

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 

我想创建/在同一时间作为文档编辑EmbeddedDocument。我一直在使用fields_for尝试:

<% f.fields_for :address, @user.addresses do |address| -%> 
    <div class="field"> 
    <%= address.label :street %><br /> 
    <%= address.text_field :street %> 
    </div> 
<% end %> 

,但我得到

未定义的方法`大街”的#< \阵列:0x0000010126e3f8>

预先感谢您。

+0

我不确定这是否有帮助,但通常这是通过在父模型中声明“accep_nested_attributes_for”(在这种情况下为User),然后在表单中提交包含“ _attributes”(address_attributes in这个案例)。 我知道Mongoid支持accept_nested_attributes_for。我不认为MongoMapper会。一些谷歌搜索显示其他一些人要求这个功能,无济于事。 – 2011-06-14 20:55:38

+0

请参阅此问题:http://stackoverflow.com/questions/2480165/creating-a-form-for-editing-embedded-documents-with-mongomapper – 2011-09-21 22:24:05

回答

2

fields_for将工作,如果您在User上定义addresses_attributes=。出于某种原因,如果您定义该方法,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 

未经检验的,所以你必须要制定出扭结。特别是,我不记得如果地址是全新的,因为用户是新的,嵌套参数是如何以不同的方式通过的。

0

据我记得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 

感谢布赖恩,这提供了一个解决方案,我有一个类似的问题。