0

フィルターの前後に繰り返しコードを配置して、コントローラーをドライにするのが好きです。私の現在のプロジェクトでは、すべてのアクションに同じrespond_toブロックがあります。

respond_to do |wants|
  wants.html
  wants.js { render :layout => "transition" }
end

私はこれを次のafter_filterように配置しました:

after_filter :respond_to_html_or_transition

しかし、それはこのエラーにつながります:

このアクションでレンダリングやリダイレクトが複数回呼び出されました。render または redirect のみを呼び出すことができ、アクションごとに最大 1 回のみ呼び出すことができることに注意してください。また、redirect も render もアクションの実行を終了しないことに注意してください。そのため、リダイレクト後にアクションを終了する場合は、「redirect_to(...) and return」のようなことを行う必要があります。

respond_toこれは、明示的またはredirectアクション内にない場合でも発生します。これは、Rails (明示的なrespond_to呼び出しがないため) が知識に基づいた推測を行いrespond_toafter_filter. その場合、Rails がそれを行わないようにして、代わりにブロックを使用する方法はありafter_filterますか?

4

1 に答える 1

0

あなたが達成しようとしていることは、after_filter では不可能です。after フィルターは、既にレンダリングされたアクションを処理します。その時点で、レンダーは (明示的または暗黙的なレンダーのいずれかで) 既に完了しているため、render を呼び出すと二重呼び出しが発生します。

メソッド内のコード ロジックを抽出し、メソッドを呼び出すことができます。もう 1 つの方法は、アクションの本体を単一のメソッドで処理できると仮定して、すべてのアクションを単一のアクションのエイリアスにすることです。

最後になりましたが、カスタム アクション レスポンダーを記述して、コントローラー設定のデフォルトのものを置き換えることができます。

self.responder = CustomActionResponder
于 2013-05-02T16:31:39.047 に答える