我基本上是在教自己如何同时使用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
您可以就这些主题提供的任何建议都会对我有所帮助!
谢谢,
亚历
答案 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”方法。混合这两种风格有点烦人。
最后,我希望我能找到所有可能验证的官方文档描述,这对我相信有很多帮助。
亚历