2011-12-02 67 views
4

我剛剛開始討論Ruby。我的背景是.NET和PHP。在Rails中,我敢肯定,在其他框架,以及,我看到這樣的東西的類:Rails的「驗證」是什麼類型的語言結構?

class Person < ActiveRecord::Base 
    validates :terms_of_service, :acceptance => true 
end 

究竟什麼是「只會驗證」?它是一個函數嗎?如果它是一個函數,驗證實際上是如何工作的,因爲你不告訴validates函數你正在驗證哪個模型?

我在哪裏可以閱讀更多關於這個幕後實際情況的信息?

回答

9

這......有點複雜 - 但簡短的回答是,validatesPerson一個類的方法,從ActiveRecord::Base繼承。該行可能已被寫入validates(:terms_of_service, :acceptance => true)

紅寶石,想了很多解釋的語言,有效地「執行」類的定義,所以當它遇到validates線,它認爲這是一個方法調用在當前self對象是Class類代表類實例Person,繼承自ActiveRecord::Base。它調用該方法,該方法將驗證程序掛接到Person類中。

你可以閱讀有關該方法的here - 但是,請注意,增加了更多的混亂,因爲它列出了方法的ActiveModel::Validations::ClassMethods實例方法。咦?那麼,Ruby有兩種方法可以從另一個Module獲取功能並將其放入您的類中 - 您可以使用include模塊(在這種情況下,它的實例方法成爲您類的實例方法),或者模塊(在這種情況下,它的實例方法成爲您的類的方法)。

因此,要總結:validates被聲明爲的ActiveModel::Validations::ClassMethods實例方法,這是extend編入ActiveRecord::Base。因此,validatesActiveRecord::Base的一類方法,並且通過繼承,Person。代碼片段中的行只是一個方法調用。然而,儘管如此,大多數Rubyists和Railsists將會在很大程度上忽略這些事實; validates就是所謂的「裝飾者」,大多數人只會簡單地將其讀作Person

+0

謝謝,這非常有幫助! – TaylorOtwell

2

這是一種特殊的回調方法,在將數據保存到數據庫之前被調用來驗證數據。

回調,更一般地說,是一種「鉤入」對象或代碼模塊/庫的方法,以便在某些事件發生時自動調用該方法。在這種情況下,調用驗證方法集的事件是試圖將某些內容保存到數據庫的行爲。這很有用,因爲在將新的或更新的信息寫入數據庫之前,您需要確保它是有效的,以防止不良數據泄漏到您的應用程序中。

以下方法觸發驗證,並將保存對象,以僅當所有的驗證通過數據庫(在字面意義上,這意味着所有的驗證方法必須返回一個值,該值是不false,或nil等,否則驗證被認爲是失敗):

  • 創建
  • 創造!
  • 節省
  • 節省!
  • 更新
  • update_attributes
  • update_attributes!

Ruby中的「Methods」非常類似於其他語言中的函數的概念。在許多情況下,你可以互換地考慮它們 - 它們聲明瞭一些功能,它們將參數作爲輸入,並將結果作爲輸出返回。

上驗證的更多細節:http://guides.rubyonrails.org/active_record_validations_callbacks.html

紅寶石(和Rails)在許多不同的情況下使用「回調」 - 你想幾乎隨時隨地一些方法被調用一些事件發生的歷史的結果。

的回調更多閱讀:http://www.khelll.com/blog/ruby/ruby-callbacks/

+0

感謝您的回覆。那麼這個方法實際上屬於這個類嗎?如果是這樣,我認爲它可以使用晚期靜態綁定來知道它正在驗證哪個模型?我只是不習慣看到坐在這樣的班級中的方法調用。通常他們在其他方法或其他方面。 – TaylorOtwell

+0

這是一種類方法。當沒有一個方法被調用時,Ruby有一個隱式的自我接收器,在這種情況下,它將成爲你的ActiveRecord子類。 Rails在幕後維護一個驗證列表,當validate方法在類加載時執行時,它會向鏈中添加一個回調。回調將在@ normalocity的答案中列出的方法之後進行檢查。 – Kyle

+0

驗證方法集合來自ActiveRecord :: Validations(http://ar.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html) - 該鏈接提供了幾個「show source」鏈接,它們將顯示實際的源代碼驗證方法如何聲明的代碼,並且可能會爲您提供更多的信息。 – jefflunt

相關問題