2012-03-22 14 views
0

、私はほとんどいつものように、フラッシュ誤差を設定し、リダイレクト異なるチェックを持っている:フィルタを使用する前に、またはコントローラにとどまっていますか?私のコントローラのアクションで

def create 
    flash[:error] = I18n.t('error.no_resources') and redirect_to research_center_url and return if not resource_report[:has_resources] 

    flash[:error] = I18n.t('error.no_deps') and redirect_to research_center_url and return if not research.fulfil_requirements?(active_city) 
    ... 
end 

これは正常に動作しますが、しかし、私は多分before_createのための私のモデルのものを持つよりも優れているチェックチェックすることを考えましたコントローラ内のチェック(ただし、フラッシュメッセージは一般にコントローラ内にあるはずです)。

しかし、実際には正常にフェッチできない非モデル関連の情報が含まれているため、これらのチェックを私のモデルに入れることはできません。だから私の質問は、どのように例外ではない通常のアプリケーション関連のエラーのあなたのコントローラをチェックし、ユーザーにフラッシュバックする必要がありますか?モデルコールバックや他の方法で、私がここでやっているように、コントローラでチェックをしていますか?

答えて

1

多くのコントローラファイルではなくbefore_filterを使用する最も早い方法は、before_filterを使用してApplicationControllerをサブクラス化することです。

これは、自動的にこの例ではbefore_filters

の同じセットを共有する複数のコントローラファイルを持つことができます、私はサブクラスFrontControllerを呼んでいます。任意の名前を使用できます。

例えば

class FrontController < ApplicationController 
# Used for all "frontend" controllers which have the same checks. 

    before_filter :standard_checks 
    # standard_checks will be a before filter for all controllers that 
    # inherit from this controller class 
end 

その後、

class SomeController < FrontController 

    def create 
    .... 
    end 
end 
+0

問題は、チェックが標準ではないということです。それらのうちのいくつかは、レベルに関するもの、要件に関するもの、役割に関するものなどです。しかし、同じパターンを持つ小切手のいくつかについては、アイデア+1が好きです。 – Spyros

+0

私にとって、フィルタを使用するのはDRYコードだけでなく、コントローラの動作をリーンに保つことです。また、あなたがそれらのフラッシュメッセージでやっていることはまさにそれです - あなたがそこに着く前に、フィルタリングしてアクションが呼び出されるのを防ぐ。 – aceofspades

関連する問題