web-dev-qa-db-ja.com

before_filterはアクションをキャンセルしません

Rails 1.9(?)から2.3.11に最近アップグレードしたアプリでフィルターが機能する前に取得するのに問題があります。コントローラ:

before_filter :false_filter

およびapplication_controller.rbに次のようにします。

def false_filter
  puts "false filter running"
  false
end

次に、cucumber/webratまたはブラウザのいずれかからメソッドを呼び出します。フィルターが呼び出されている間(putsがメッセージを出力しているのを確認できます)、フィルターチェーンは終了していません。

生成されていない定型的なコードがあるかどうか疑問に思っています。誰がどこを見ればよいか提案できますか?

50

フィルター前の戻り値に注意を払うものはありません。処理を停止したい場合は、フィルターから何かをレンダリングするか、別の場所にリダイレクトする必要があります ファインガイドから

Beforeフィルターがレンダリングまたはリダイレクトする場合、アクションは実行されません。そのフィルターの後に実行するようにスケジュールされた追加のフィルターがある場合、それらもキャンセルされます。

同じテキストが 5.2.0ガイド に表示されます。

この動作は理にかなっています。フィルターチェーンが完了しない場合(つまり、途中でフィルター処理を停止する場合)、コントローラーメソッドを呼び出しますが、予期しない方法で設定すると、痛みが発生します。 、苦しみ、混乱、そしてそれはまったく友好的でも楽しいことでもありません。

96
mu is too short