2011-01-13 65 views
0

我基本上在教自己如何同時使用RoR和MongoDB。 我跟着很好的書/教程:http://railstutorial.org/如何使用rails控制檯從mangomapper獲取驗證消息?

我決定使用mongomapper gem替換MongoDB的Sqlite3。 一切正常,但我有一些非阻塞的小問題,我真的希望我可以擺脫。

在第6章中,在驗證過程中,我得到了兩個問題: - 我不知道如何使用Sqlite3獲取驗證消息。

「標準」的代碼是:

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

但如果我嘗試做MongoMapper一樣,它拋出一個錯誤,指出錯誤未定義功能。那麼這是否意味着這只是在mongomapper/mongo驅動程序中沒有實現?還是有其他一些聰明的方法來做到這一點,我無法想象?

另外,兩件事情在這裏: - 我按照書上的線爲例,所以我期待能夠使用沙盒模式控制檯,但顯然這無法正常工作或:

(...)[email protected]/gems/railties-3.0.3/lib/rails/console/sandbox.rb:1:in `<top (required)>': uninitialized constant ActiveRecord (NameError) 
from /Users/Alex/.rvm/gems/[email protected]/gems/railties-3.0.3/lib/rails/application.rb:226:in `initialize_console' 
from /Users/Alex/.rvm/gems/[email protected]/gems/railties-3.0.3/lib/rails/application.rb:153:in `load_console' 
from /Users/Alex/.rvm/gems/[email protected]/gems/railties-3.0.3/lib/rails/commands/console.rb:26:in `start' 
from /Users/Alex/.rvm/gems/[email protected]/gems/railties-3.0.3/lib/rails/commands/console.rb:8:in `start' 
from /Users/Alex/.rvm/gems/[email protected]/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命名約定或什麼?

最後,我嘗試使用正則表達式驗證字段電子郵件,如教程中所示。它不會在代碼拋出的任何錯誤,但每當我試圖插入它只是永遠不會接受它,除非我註釋掉:格式選項...

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

此行添加到您的模型:

validates_presence_of :name 

.errors所特有的ActiveRecord的,所以是如果您嘗試使用它,你會得到一個錯誤。

User將是類,user將是一個類的實例 - 沒有一個例子,我不能幫你在這裏。

爲了擺脫控制檯中的問題,您需要在應用程序的某個地方使用require 'active_record',因爲您的代碼的某些部分仍在使用它,但無法找到它的定義,因爲Gem不是必需的。

你在使用Bundler嗎?將它添加到包中。使用Ruby Gems,只需要在你的應用程序中需要適當的地方。

+0

是的,我正在使用捆綁器。但從我在不同的教程和mongodb.com上看到的是,使用mongo驅動程序和映射器Rails沒有使用activerecord,這就是爲什麼我沒有將它添加到我的Gem中。 – Alex 2011-01-13 07:32:31

0

非常感謝stef提醒了類和實例化對象之間的區別(Duh!)我意識到,我讀這種方式太快:)

從一開始我試圖從我的類而不是實例化對象的方法。

所以現在,我完全可以得到妥善user.errors.full_messages ...

與驗證:)並希望感謝幫助我能得到我的正則表達式驗證排序!

Alex

0

好吧,我得到了驗證問題(電子郵件也修復了)。

此代碼將如預期:

email_regex = /\A[\w+\-.][email protected][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 

我有一個艱難的時間搞清楚究竟什麼工作,什麼也不會......,因爲除非我不知道如何使用谷歌了,這沒有真正記錄在任何地方。您可以在slideshares,github,google group等與mongomapper有關的信息中找到一些信息。

不要誤解我的意思,我喜歡mongomapper和約翰所做的工作,但現在驗證過程有點麻煩......它的一部分仍然使用「舊」的2.x導軌系統,另一部分使用新的3.x軌跡符號...

我喜歡新的3.x符號好得多,因爲它允許您將所有驗證條件集中在一個位置。就像上面的例子:length => {:maximum => 50}。但爲了獲得適當的唯一性和格式,我必須使用密鑰聲明之外的「validates_xxxx」方法。這對混合兩種風格有點煩人。

最後,我希望我能找到所有可能的驗證的官方文檔說明,這將有助於我相信很多。

Alex