2011-11-21 42 views
1

创造记录时,我有一个类,看起来像这样:未定义的方法“删除”的字符串:类使用Mongoid并通过控制台

class SearchService 
    include Mongoid::Document 

    key :name, String 
    field :url, String 
    field :searchBaseUrl, String 

    validates_presence_of :name, :url, :searchBaseUrl 
    validates_uniqueness_of :name 
end 

这里的第一个问题是,我用validates_presence_of不当或因此它似乎。我评论了这一行,我可以在控制台创建类实例,没有任何问题。但是,当我尝试创建具有validates_presence_of的对象时,出现错误:

NoMethodError: undefined method `delete' for String:Class 
from D:/Ruby193/lib/ruby/gems/1.9.1/gems/mongoid-2.3.3/lib/mongoid/fields.rb:230:in `add_field' 
from D:/Ruby193/lib/ruby/gems/1.9.1/gems/mongoid-2.3.3/lib/mongoid/fields.rb:145:in `field' 

此错误消息是否有意义?我很难看到String类中缺少方法和我错误地使用validates_presence_of之间的关系。如果我只能选择一件关于Ruby的东西,那就会导致错误信息。

rails docs表示validates_presence_of用于关联。但mongo db page表示它用于必填字段。 mongodb文档是不正确的?

我想确定这是否是一个问题,我应该向mongoid团队报告,或者如果我只是不理解语言是如何工作的。

更新:好吧,现在我在类中根本没有使用validates_presence_of的类似错误。所以这是一些其他问题(尽管最初注释掉该行)。

Update2:这对我来说似乎是在mongoid中的错误。更改此行:

field :namefield :name, String

将导致错误出现。似乎任何使用类型定义的字段都会使mongoid变得混乱。或者那些不应该在那里? mongodb文档(上面链接)的代码看起来像key :votes, Integer, :default => 0,所以如果它是无效的文档是错误的。

的Rails 3.1.1,1.9.3红宝石

+0

的Rails的哪个版本是你吗? –

+0

@Alex更新问题 – jcollum

回答

4

您使用字段类型定义的语法不正确。它应该使用选项散列和键“类型”。从文档http://mongoid.org/

class Artist 
    include Mongoid::Document 
    field :name, type: String 
    embeds_many :instruments 
end 

你指的MongoMapper的例子,但使用Mongoid))

+0

啊,我明白了,所以文档中的类定义依赖于MongoMapper。奇。我来自C#世界,对我来说这是一个奇怪的依赖。 – jcollum

+0

jcollum,你使用的是mongoid而不是mongomapper。请确保你指的是正确的一组文档。 mongoid文档相当不错。 –

+0

@泰勒同意,这是非常好的。我刚刚被Ruby与C#(我的背景)做的这些东西抛弃了。 – jcollum

0

在Rails 3,您应该使用new style validations

validates :name, :presence => true, :uniqueness => true 
validates :url, :presence => true 
validates :searchBaseUrl, :presence => true 

使用with_options,使之干燥

with_options :presence => true do |v| 
    v.validates :name, :uniqueness => true 
    v.validates :url 
    v.validates :searchBaseUrl 
end 
+0

这是一个很好的建议,但不回答我的问题 – jcollum

+0

我认为这可能会导致问题 - 旧式可能不适用于最近版本的Mongoid –

+0

但是,读过更新,可能不是 –

2

jcollum例如,问题是从事实来您正在使用mongoid但mongodb.org的例子是使用mongomapper。

请注意,这些是不同的ODM for rails,并且定义字段的语法略有不同。

请参阅文档here为mongoid。

使用mongoid字段的格式为:

class Person 
    include Mongoid::Document 
    field :first_name, type: String 
    field :middle_name, type: String 
    field :last_name, type: String 
end 
相关问题