我在我的应用程序中使用了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
但这给了我一个错误。我正在拒绝创建一个未登录的新方法。
请帮我弄清楚完成此操作的正确语法。
答案 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