6

我在我的应用程序中使用 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

现在在我的用户控制器中,我希望仅在用户未登录时才执行操作。为此,我想将not条件与logged_in?方法一起使用before_filter为:

before_filter :!(logged_in?)

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

请帮我找出正确的语法来完成这个。

4

3 回答 3

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

于 2012-09-03T18:04:05.450 回答
8

您可以将块传递给before_filter

before_filter { |c| !c.logged_in? }

但这不会真正做任何事情,因为来自 before 过滤器的返回值不会去任何地方。如果您想在用户未登录的情况下执行操作,那么您应该将该操作放入 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
于 2012-09-03T13:14:12.003 回答
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
于 2016-01-14T13:30:21.317 回答