Rails使用不与before_filter一起使用

时间:2012-09-03 12:47:52

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

我在我的应用程序中使用了before_filter。我有一个方法logged_in?,如果用户登录则返回true。

def logged_in?
  !!current_user
end

def current_user
  @current_user = (User.find(session[:user_id]) if session[:user_id]) || false
end

现在在我的用户控制器中,我希望仅在用户未登录时才执行操作。为此,我想在{{1}中使用{strong>非条件和logged_in?方法as:

before_filter

但这给了我一个错误。我正在拒绝创建一个未登录的新方法。

请帮我弄清楚完成此操作的正确语法。

3 个答案:

答案 0 :(得分:18)

虽然接受的答案似乎有效,但我会以不同的方式完成。

before_filter :login_required, unless: :logged_in?

def login_required
  redirect_to login_path, notice: 'Please login'
end

除非用户已经登录,否则这将执行login_required方法。有关详细信息,请参阅http://robots.thoughtbot.com/post/159805303/before-filter-wisdom

答案 1 :(得分:8)

你可以将一个块传递给before_filter

before_filter { |c| !c.logged_in? }

但是这不会真正做任何事情,因为前一个过滤器的返回值不会去任何地方。如果您想在用户未登录时执行操作,那么您应该将该操作放入before_filter。

例如,如果操作是重定向到登录页面路径,则可以执行以下操作:

before_filter { |c| redirect_to login_path unless c.logged_in? }

这实际上足以证明其自身方法的合理性:

before_filter :login_required

def login_required
  redirect_to login_path unless logged_in?
end

答案 2 :(得分:0)

application_controller.rb

before_filter :authorize

def current_user
   @current_user ||= User.find_by(id: session[:user_id])
end
   helper_method :current_user

protected
def authorize
   unless User.find_by(id: session[:user_id])
     redirect_to login_url, :notice => "Not Authorize Member"
   end
end