2

コントローラーがあり、そのすべてのメソッドは次のコードで始まります。

@user = UserData.find_by_login(session[:cuser])

if @user == nil
  redirect_to(:controller=> 'user_data', :action=> 'login')
  return
end

この場合、コードの重複を避けることができるかどうか疑問に思っていますか?

4

4 に答える 4

2

はい、before_filterを使用します

class YourController < ApplicationController

  before_filter :check_user

  def check_user
  ..
  end

end
于 2012-11-14T11:42:17.627 に答える
2

絶対。

class MyController < ApplicationController
  before_filter :ensure_logged_in

  # actions here.

  def ensure_logged_in
    @user = UserData.find_by_login(session[:cuser])

    if @user == nil
      redirect_to(:controller=> 'user_data', :action=> 'login')
    end
  end
end

リダイレクトが発生すると、レールはフィルター パイプラインから抜け出すため、「リターン」について心配する必要はありません。

于 2012-11-14T11:42:46.927 に答える
1

重複を避けるには、ユーザー認証を確認するすべてのコントローラーに before_filter を追加するだけです。

class SomeController < ApplicationController

   before_filter :authenticate_user

end

次に、アプリケーションコントローラーにユーザー認証ロジックを次のように追加します。

class ApplicationController < ActionController::Base

  private

  def current_user
    @current_user ||= UserData.find_by_login(session[:cuser]) if session[:cuser]
  end
  helper_method :current_user

  def authenticate_user
    redirect_to({:controller=> 'user_data', :action=> 'login'}, :alert => "Not authorized") if current_user.nil?
  end
end

すべてのコントローラーで current_user ヘルパー メソッドを使用して、現在のユーザーを取得できます。

于 2012-11-14T13:16:15.620 に答える
0

filter の前に使用してみてください。これでいいはず

于 2012-11-14T11:42:42.520 に答える