2016-11-01 9 views
1

Iは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 } 

これは正しい方法はありますか?

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 

を、あなたは今、それが好き呼び出す:

答えて

1

私はこれをやって巻き上げ

Filters.filter(self, :authorize_admin) 
+0

私はあなたが 'procのを削除した場合、{}'、あなたが 'instance_evalを&filter_method'使用することができると思います。 –

+0

@maxpleaner他のコントローラでも 'before ...、&...'スタイルを使いたいので、 'proc'を削除できません。しかし、私はそれらの他のコントローラをリファクタリングすることができると思いますか? –

関連する問題