2010-01-18 28 views
2

我是Ruby的新手,並通過一些教程/屏幕錄像工作。我已經到了他們正在討論before_filter回調的部分,它使用了一些對我來說有點奇怪的語法。我不知道這是否是紅寶石的一個特徵,是否有一些軌道魔法,並且希望有人能夠讓我直接或者指向正確的方向w/r/t手冊從Ruby類中調用方法? (或者這是軌道魔術)

這是一個代碼從截屏視頻片段我看

class MachinesController < ApplicationController 
    #... 
    before_filter :login_required, :only => [:report] 
    #...  
    def index 
     #etc... 
    end 

    def login_required 
     #etc... 
    end 
end 

在軌的情況下,我的理解是before_filter是一個回調,這將觸發login_required方法時report動作被調用。然而,我不清楚它是在ruby的背景下。在其他語言中,類通常包含大括號內定義的方法,屬性,類變量和常量。

但是,這看起來像是它在類中的一個函數調用,並且一些實驗表明,您可以將代碼放入類定義中,並在程序運行時調用它。它是否正確?如果是這樣,是否有特殊的上下文規則將代碼內聯到類似的類中? (即rails中的before_filter函數是否知道它被調用的是什麼類)如果不是,Rail在這裏做什麼魔術?

+0

國際海事組織你應該選擇莎拉梅的答案作爲你選擇的答案,它提供了最好的和最完整的解釋。 – horseyguy 2010-01-23 00:38:39

+0

莎拉的回答非常好,但這是我沒有問過的問題。我對類中的方法的調用感到困惑,這是你在PHP或Java中無法做到的。我想知道這是否是一些軌道魔法,或者如果Ruby支持這一點,並且如果Ruby支持這一點,那麼在一個類中不同的w/r/t調用代碼是什麼。喬納森回答說,解釋了自我如何改變了身份。 – 2010-01-23 04:00:16

+0

也許這個問題應該編輯一下,我想的是這樣的:「Ruby:從類定義中調用函數」 – 2012-05-23 22:23:45

回答

5

before_filter實際上不是回調。這是一個class method of ActiveRecord::Base,當您調用它時會設置回調。因此,在這個例子中:

before_filter :login_required, :only => [:report] 

當把類裝載,所述方法被調用,並把它添加到:login_required過濾器鏈的report方法。

這些類型的呼叫約定是下降的括號,但如果你這樣做它會工作得很好(並會更容易被識別爲一個方法調用):

before_filter(:login_required, :only => [:report]) 
+0

+1迄今爲止的最佳答案 – horseyguy 2010-01-18 10:34:36

0

Ruby很酷。您絕對可以從一個課程塊中發送消息。據我瞭解,class除了顯而易見的外,還有其他的東西是控制self的身份。因此,你應該能夠從那裏調用該類的任何方法或包含的模塊。

+0

啊,我還沒有遇到過self關鍵字,或者學習瞭如何定義靜態/類方法。這使得現在更有意義(但仍然非常奇怪) – 2010-01-18 08:01:59

+1

您不能從類定義中調用在「包含的模塊」上定義的方法。爲了在類定義中調用模塊提供的方法,模塊必須在類中「擴展」而不是「包含」。 – horseyguy 2010-01-23 00:36:07

0

我不知道你的問題是什麼,但這裏是我的解釋:

before_filter 

這是一個類的方法調用看ActionController

:login_required 

這是對的before_filter方法的參數,並用作回撥使用Object#send

:only => [:report] 

Th是before_filter的另一個Hash參數,請參閱ActionController

我也建議看看before_filter方法的實現以獲得洞察。

+0

我的問題/困惑主要集中在以下事實上:您在類塊內運行代碼或方法定義以外的代碼。你不能用像Java或PHP這樣的語言來做這件事,我正在尋找一個解釋/教程,講解如何從一個類運行的代碼(不是類方法)與運行在類定義之外的代碼不同。 – 2010-01-18 05:37:59

+0

啊,我明白了。 :) – hobodave 2010-01-18 05:42:35

+0

嘿,我只是意識到這是我一直認爲理所當然的事,從來沒有質疑過。現在,我很好奇,試圖自己找到解釋。你應該更新你的問題,使它更清楚你需要什麼,你的評論是清楚的 - 問題不是。 – hobodave 2010-01-18 05:45:17

1

不像其他一些語言,在Ruby中,類可以在運行時修改,並且可以在類定義中進行函數調用。所以在這種情況下發生的事情是,您正在調用before_filter函數,該函數然後在運行時修改MachinesController類定義。

這是一種機制,它允許您使用Rails獲得驚人的美麗(至少我的眼睛,至少)語法,它幾乎看起來像使用某種特定於域的語言來描述您的模型。類似於模型類上的validates,has_manybelongs_to函數調用。

我的理解是,這被稱爲宏,屬於元編程的保護傘。您可以read more about this topic