2016-11-01 58 views
1

我有一個Padrino應用此Ruby代碼:如何將一個Ruby`instance_eval`調用提取到方法中?

module Filters 
    def self.authorize_admin 
    proc { halt(401) unless current_user.admin? } 
    end 
end 

App.controllers :secrets do 
    before :show, &Filters.authorize_admin 
    # ... 
end 

secrets控制器接收到show路線上的請求時,它會運行authorize_admin濾波器。

如果我想這個規則適用於所有的路由,而不是,我可能會這樣寫:

before { instance_eval &Filters.authorize_admin } 

我想Filters提取這一個方法來代替,這樣我可以這樣寫:

before { Filters.only_administrators } 

什麼是正確的方法來做到這一點?

回答

1

彼時我這樣做:

module Filters 
    def self.authorize_admin 
    proc { halt(401) unless current_user.admin? } 
    end 

    def self.filter(controller, filter) 
    filter_method = method(filter.to_sym) 
    controller.instance_eval &(filter_method.call) 
    end 
end 

,現在您調用它想:

Filters.filter(self, :authorize_admin) 
+0

我認爲,如果你刪除了'PROC {}'那麼你可以使用'instance_eval的&filter_method'。 –

+0

@maxpleaner我無法刪除'proc',因爲在其他控制器中,我仍然想使用'before ...,&...'樣式。我想我可以重構那些其他的控制器,但? –

相關問題