2015-02-11 59 views
1

我知道這些陳述做什麼,但不知道如何引用它們。它們存在於一個班級內,除了該班級的方法並執行各種功能外。什麼是before_create,validates_presence_of,has_many等?

總的來說,他們叫什麼?

+0

他們的方法調用。 – 2015-02-11 09:41:13

+1

它們可能有點神奇 - 看起來乍看起來,部分原因是Ruby的可選支架,這些支架往往被省略。例如,'has_many:foos,:through =>:bars'是'has_many(:foos,{:through =>:bars})'的縮寫。當你在添加括號的時候看到它,很容易看出'has​​_many'是一個方法名,':foos'是主要參數,':through =>:bars'是一個可選的鍵值對散列,其中散列實際上是該方法的第二個參數。 – 2015-02-11 10:22:58

回答

3

這些方法實際上只是類方法。試試這個:

class Test 
    def self.before_create 
    puts "before_create" 
    end 

    before_create 
end 

你提到的具體使用案例 - Rails的DSL方法,如before_create,這只是一個class體內可用 - 通常被稱爲類的宏。 Rubys元編程能力爲您提供多種構建方法。一個簡單的一個是讓他們私人:

module Foo 
    private 

    def before_create 
    puts "before_create" 
    end 
end 

class Bar 
    extend Foo 

    before_create 
end 

before_create現在是類體訪問,但不能從外部:

Bar.before_create 
NoMethodError: private method `before_create' called for Bar:Class 
1

在純粹的Ruby術語中,它們都只是方法調用。

但是,它們確實有一個共同的主題。在構建和使用它們的方式中,您可以將它們視爲Domain-Specific Language (DSL)的一部分 - 您列出的是Active Record用於創建數據模型的DSL的一部分。

Ruby本身很適合創建類似DSL的迷你語言,使用混合或基類來提供一組類方法,這些方法反過來將存儲數據或創建方法在類和它的實例上使用元編程技術。