【问题标题】:how get validation messages from mangomapper using rails console?如何使用 rails 控制台从 mangomapper 获取验证消息?
【发布时间】:2011-01-13 07:14:33
【问题描述】:

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

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

在第 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

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

谢谢,

亚历克斯

【问题讨论】:

    标签: ruby-on-rails validation mongodb mongomapper


    【解决方案1】:

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

    validates_presence_of :name
    

    .errors 是 ActiveRecord 特有的,所以是的,如果你尝试使用它,你会得到一个错误。

    User 将是一个类,user 将是一个类的实例 - 如果没有示例,我在这里无法为您提供帮助。

    要解决控制台中的问题,您需要在应用程序的某个位置添加require 'active_record',因为您的某些代码仍在使用它,但由于不需要 Gem,因此无法找到它的定义。

    你在使用 Bundler 吗?将其添加到捆绑包中。使用 Ruby Gems,只需将要求放在应用程序的适当位置即可。

    【讨论】:

    • 是的,我正在使用捆绑程序。但是从我在其他教程和 mongodb.com 上阅读的内容来看,使用 mongo 驱动程序和映射器的 Rails 没有使用 activerecord,这就是我没有将它添加到我的 Gem 的原因。
    • 对于用户 vs 用户.. 好的,我明白了... 愚蠢的我,这完全有道理:P
    【解决方案2】:

    感谢 stef 提醒类和实例化对象之间的区别(Duh !)我意识到我读这种方式太快了 :)

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

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

    这有助于验证 :) 希望多亏了这一点,我才能对我的正则表达式验证进行排序!

    亚历克斯

    【讨论】:

      【解决方案3】:

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

      此代码将按预期工作:

      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
      

      我很难弄清楚究竟什么可行,什么不可行……因为除非我不再知道如何使用 google,否则任何地方都没有真正完整地记录这一点。您可以在 slideshares、github、google group 等上找到与 mongomapper 相关的部分信息。

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

      我更喜欢新的 3.x 表示法,因为它允许您将字段周围的所有验证条件集中在一个地方。就像上面的 :length => {:maximum => 50} 示例一样。但是为了获得正确的唯一性和格式,我必须在 key 声明之外使用“validates_xxxx”方法。混合两种风格有点烦人。

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

      亚历克斯

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-31
        • 1970-01-01
        • 1970-01-01
        • 2019-07-17
        • 1970-01-01
        • 2019-02-01
        • 1970-01-01
        相关资源
        最近更新 更多