如何使用rails console从mangomapper获取验证消息?

时间:2011-01-13 07:14:34

标签: ruby-on-rails validation mongodb mongomapper

我基本上是在教自己如何同时使用RoR和MongoDB。 我正在关注非常好的书/教程:http://railstutorial.org/

我决定使用mongomapper gem替换MongoDB的Sqlite3。 一切顺利,但我有一些非阻塞的小问题,我真的希望我能摆脱它。

在第6章中,使用验证时我遇到了2个问题: - 我不知道如何使用Sqlite3获取验证消息。

“标准”代码是:

$ rails console --sandbox
>> user = User.new(:name => "", :email => "mhartl@example.com")
>> user.save
=> false
>> user.valid?
=> false
>> user.errors.full_messages
=> ["Name can't be blank"]

但是如果我尝试对MongoMapper做同样的事情,它会抛出一个错误,说错误是未定义的函数。那么这是否意味着在mongomapper / mongo驱动程序中没有实现?还是有其他一些聪明的方法可以做到这一点,我无法想象?

另外,这里有两件事: - 我按照书中的例子说明了这一行,所以我希望能够在沙箱模式下使用控制台,但显然这也不起作用:

(...)ruby-1.9.2-p136@rails3/gems/railties-3.0.3/lib/rails/console/sandbox.rb:1:in `<top (required)>': uninitialized constant ActiveRecord (NameError)
from /Users/Alex/.rvm/gems/ruby-1.9.2-p136@rails3/gems/railties-3.0.3/lib/rails/application.rb:226:in `initialize_console'
from /Users/Alex/.rvm/gems/ruby-1.9.2-p136@rails3/gems/railties-3.0.3/lib/rails/application.rb:153:in `load_console'
from /Users/Alex/.rvm/gems/ruby-1.9.2-p136@rails3/gems/railties-3.0.3/lib/rails/commands/console.rb:26:in `start'
from /Users/Alex/.rvm/gems/ruby-1.9.2-p136@rails3/gems/railties-3.0.3/lib/rails/commands/console.rb:8:in `start'
from /Users/Alex/.rvm/gems/ruby-1.9.2-p136@rails3/gems/railties-3.0.3/lib/rails/commands.rb:23:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'

另外,在书中他们称之为“用户”,但我需要打电话给“用户”(注意大写U)为什么会这样?是不是像mangomapper不遵循Ruby命名约定或什么?

最后,我正在尝试使用正则表达式验证字段电子邮件,如教程中所示。它不会在代码中引发任何错误,但每当我尝试插入它时,除​​非我注释掉:format选项,否则不会接受它...

class User
  include MongoMapper::Document   

key :name, String, :required => true,
                   :length => { :maximum => 50 }

key :email, String, :required => true,
#                   :format => { :with => email_regex },
                    :uniqueness => { :case_sentitive => false}

timestamps!

end

您可以就这些主题提供的任何建议都会对我有所帮助!

谢谢,

亚历

3 个答案:

答案 0 :(得分:0)

将此行添加到您的模型中:

validates_presence_of :name

.errors是ActiveRecord特有的,所以是的,如果你试图使用它,你会收到错误。

User将成为课程,user将成为课程的一个实例 - 没有示例我无法帮助您。

要解决控制台中的问题,您需要在应用程序中的某处require 'active_record',因为代码的某些部分仍在使用它但无法找到它的定义,因为不需要Gem。

您使用的是Bundler吗?将其添加到捆绑包中。使用Ruby Gems,只需要在您的应用程序中使用适当的地方。

答案 1 :(得分:0)

非常感谢stef提醒我们这个类和实例化对象之间的区别(Duh!)我意识到我读得这么快:)

从一开始我就试图从我的类中获取方法,而不是实例化的对象。

现在,我可以完全正确地获取user.errors.full_messages ...

这有助于验证:)并且希望由于我能够对我的正则表达式验证进行排序!

亚历

答案 2 :(得分:0)

好的,我收到了验证问题(也修复了电子邮件)。

此代码将按预期工作:

email_regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

key :name, String, :length => { :maximum => 50 }
key :email, String  
timestamps!

validates_presence_of :name, :email

validates_uniqueness_of :email, :case_sensitive => false 

validates_format_of :email, :with =>email_regex

我很难确定哪些会起作用,哪些不起作用......因为除非我不知道如何使用谷歌,否则这在任何地方都没有真正记录。你可以在有关mongomapper的slidehares,github,google group等上找到部分信息。

不要误会我的意思,我喜欢mongomapper和john已经完成的工作,但现在验证过程有点乱......它的一部分仍然使用“旧的”2.x轨道系统和其他部分使用新的3.x轨道表示法......

我更喜欢新的3.x符号,因为它允许您在一个地方集中所有验证条件。喜欢:length =&gt; {:maximum =&gt; 50}上面的例子。但为了获得适当的唯一性和格式,我必须在 key 声明之外使用“validates_xxxx”方法。混合这两种风格有点烦人。

最后,我希望我能找到所有可能验证的官方文档描述,这对我相信有很多帮助。

亚历