2011-07-13 52 views
1

我正在使用动态表单生成器。而且我发现奇怪的行为Mongoid字段问题

class Model 
    include Mongoid::Document 
    field :name, :type => String 
end 

model = Model.new 
model.name = "My Name" 
model.surname = "My Surname" 
#=> NoMethodError: undefined method `surname=' 

model = Model.new(:name => "My Name", :surname => "My Surname") 
#=> ok 
model.surname 
#=> "My Surname" 
model.surname = "New Surname" 
#=> "New Surname" 

有人可以解释为什么我可以创建质量分配新的领域和无法通过属性字段添加?

回答

3

根据Mongoid文档,getter/setter方法(例如.surname)只有在文档中存在该字段时才会起作用(这就是为什么当您使用该字段创建新的Model时)。

你仍然可以设置/读取领域,像这样:

model[:surname] 
model.read_attribute(:surname) 
model[:surname] = "My Surname" 
model.write_attribute(:surname, "My Surname") 

http://mongoid.org/docs/documents/dynamic.html

+0

谢谢@Dylan!那就是 – fl00r

+0

这是相同的功能:'model [:surname] =“My Surname”''和'model.write_attribute(:surname,“My Surname”)''。有什么不同?我刚刚测试过 - 看起来非常相似,但该文档中没有评论文章 – fl00r

+1

源代码具有'alias:[]:read_attribute',因此它们完全相同(与'[] ='和'write_attribute相同')。只需使用你喜欢的那个。 –