21

フィルターが発生する前の順序は? 具体的には、継承に関して 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のドキュメントでこれを見つけることができません。

4

3 に答える 3

25

フィルタに関するソース コードAPI ドキュメントを参照することをお勧めします。

デフォルトの順序は

  1. :set_post
  2. :set_user

:set_userスタックの一番上にプッシュしたい場合は、行を次のように変更できると思いAます

prepend_before_action :set_user

また、指摘する価値があるのは、このトピックに関する質問はこれだけではありません。SOには他にもあります。


あなたの具体的な状況については、ランの時間までに割り当てられるAようにするには、前述のように変更する必要があるようです。@userset_postB


4.2.6 の時点で (おそらく以前のバージョンで変更された可能性があります)、順序付けは子の前に親になっています。

  1. :set_user
  2. :set_post
于 2013-09-03T01:04:24.687 に答える
8

受け入れられた答えは、Rails 4.2.6 では当てはまりません。以前に変更された可能性がありますが、それが現在使用しているバージョンです。

親フィルターは子フィルターの前に呼び出されるようになったため、順序は次のようになります。

  1. :set_user
  2. :set_post

そして、考えてみれば、その順序付けはより理にかなっています。前述のように、子が親の前にフィルターを呼び出す必要がある場合は、 を使用する必要がありますprepend_before_action

于 2016-07-14T15:21:55.013 に答える
0

はい、コードは意図したとおりに機能します。

派生クラス (B) の before_filters は、基本クラス (A) の before_filters の前に呼び出されます。したがって、呼び出されるメソッドの順序は次のとおりです。

  1. set_user()
  2. set_post()
  3. 見せる()

また、after_filters は逆の順序で呼び出され、最も派生したものが最初に呼び出されることに注意してください。

于 2014-04-25T19:33:54.880 に答える