每个控制器方法中的代码

时间:2012-11-14 11:37:57

标签: ruby-on-rails ruby-on-rails-3

我有一个控制器,它的每个方法都以下面的代码开头:

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

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

我只是想知道在这种情况下是否可以避免代码重复?

4 个答案:

答案 0 :(得分:2)

是的,请使用before_filter

class YourController < ApplicationController

  before_filter :check_user

  def check_user
  ..
  end

end

答案 1 :(得分: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

你不应该担心'返回',因为一旦重定向发生,rails会从过滤器管道中拯救出来。

答案 2 :(得分: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帮助程序方法来获取当前用户。

答案 3 :(得分:0)

尝试使用before filter。这应该没问题