2013-09-03 10 views
19

フィルタの前にはどのような順序がありますか?具体的には、before_actionフィルタはどのような順序で発生するのですか?たとえば、これは動作しますか:フィルタの前にはどのような順序がありますか?

class A < ActionController::Base 
    before_action :set_user 

    def set_user 
    @user = something 
    end 
end 

class B < A 
    before_action :set_post 

    def show 
    render @post 
    end 

    def set_post 
    @post = @user.posts.first 
    end 
end 

「B#show」は機能しますか?将来の参照のためにフィルタ順序の規則は何ですか?私はRailsのドキュメントでこれを見つけることができません。

+0

'' '' ''クラスが* ActionController *のようなコントローラから継承していませんか? '' B''インスタンスに対してアクションが実行されると、 '' 'set_user''のような継承されたフィルタが最初に呼び出されます。 –

+0

申し訳ありません。修正しました。 –

+0

注文を修正する方法:http://stackoverflow.com/questions/5711797/how-can-i-specify-the-order-that-before-filters-are-executed –

答えて

19

私はフィルターにthe source codeAPI Docsでご覧になることをお勧めします。

デフォルトの順序は

  1. :set_post
  2. :set_user

する必要があります私はあなたがスタックの最上部に:set_userをプッシュしたい場合は、

Aにラインを変えることができると思います
prepend_before_action :set_user 

また、これはトピックに関する唯一の質問ではないことを指摘する価値があります。 others here on SOがあります。あなたの特定の状況については


私は@userBの実行に時間set_postによって割り当てられるようにするために前述したように、あなたがAを変更する必要がありますように、それが見えます。 4.2.6(おそらく以前のバージョンに変更)のよう


は、順序は今、子の前に親である:

  1. :set_user
  2. :set_post
+1

ありがとうございます。それが私の必要なものです。 –

+0

デフォルトの順序(上記)が後方にあります。派生クラス(B)のbefore_filtersは、基本クラス(A)before_filtersの前に呼び出されます。これは次のとおりです:1.:set_user、2.:set_post また、after_filtersは逆の順序で呼び出されます。 –

+6

Rails 4.2でこれを試しましたが、これはもう有効ではないようです。親クラスのコールバックが最初に実行され、次に子のクラスコールバックが実行されます。だから:1) 'set_user'、2)' set_post' – head

0

はい、あなたのコード意図したとおりに動作します。

派生クラス(B)のbefore_filtersは、基本クラス(A)のbefore_filtersの前に呼び出されます。だから、呼び出されるメソッドの順序は以下のとおりです。

  1. SET_USER()
  2. set_post()
  3. ショー()

また、ほとんどの最初の派生、after_filtersは逆の順序で呼び出され、注意してください。

+2

あなたが言ったように、Bが派生クラスであるため、派生クラスのbefore_filterが最初に呼び出され、set_postが最初に呼び出され、次にset_userが呼び出されます。 – DallaRosa

5

Rails 4.2.6では、受け入れられた答えはもはや真です。それはおそらく以前に変更されていたが、それは私が現在行っているバージョンだ。

順序が今になりますので、親フィルターは今、子フィルタの前に呼び出されます。

  1. :set_user
  2. :set_post

そして、あなたはそれについて考える場合、その順序は本当に多くを作りますセンス。前述したように、子供が親の前にフィルタを呼び出す必要がある場合は、prepend_before_actionを使用する必要があります。

関連する問題