0

いくつかのアクションがあります (action_a、action_b などと呼びましょう)。

各アクションで、ユーザーがログインしているかどうかを確認し、respond_to次のようにブロックしない場合は確認したい

 format.js {
          if current_user.nil?
            render partial: 'some_partial', handler: [:erb], formats: [:js]
          end
        }

1 つのアクションについてはこれで問題ありませんが、多くのアクションについてはそうではありません。まったく同じことを行うこのコードの重複が多数あるため、あまりきれいでも維持しやすいものでもありません。

このコードを再利用し、必要なすべてのアクションで書き直さないように、これをどこかに置く方法はありますか?

4

2 に答える 2

2

before_filter (rails <4.0) または before_action (rails 4.0)を使用する

class YourController < ApplicationController
  before_filter :check_user

  ...
  your actions
  ...

  private
    def check_user
      redirect_to sign_in_path if current_user.nil?
    end
end

または、特定のアクションが必要な場合は、around_action (フィルター) を使用して応答します。

class YourController < ApplicationController
  around_action :check_user

  ...
  your actions
  def show
    @variable = Variable.last
  end
  ...

  private
    def check_user
      yield #(you normal action without js respond)
      format.js {
        if current_user.nil?
          render partial: 'some_partial', handler: [:erb], formats: [:js]
        end
      }
    end
end
于 2013-07-31T09:09:03.377 に答える
2

Respondersを読んでください。これらはそれを助けるためのものです。

あなたの特定の問題は、フィルターが一般的に使用されるものです。アクションコントローラーガイドのフィルターに関するこのセクションを参照してください

より一般的には、これは単なる Ruby コードなので、すべてをメソッドにリファクタリングできます。

def do_stuff_with(partial_name, format)
  if current_user.nil?
    render partial: partial_name, handler: [:erb], formats: [format]
  end
end


format_js { do_stuff_with('some_partial', :js) }
于 2013-07-31T09:09:06.730 に答える