Ruby on Rails:before_filter =>:only_when_user_is_logged_in
使用Ruby on Rails,我希望在过滤操作之前,但仅在用户登录时才这样做。
这怎么可能?
我想你只是在用户登录时才会询问如何运行一个前置filter。这里没有内置的语义,但它很容易内联:
class SomeController < ApplicationController before_filter :do_something def do_something if logged_in? # the stuff you want to do end end end
before_filter :only_when_user_is_logged_in, :only => :the_action
或多个
before_filter :only_when_user_is_logged_in, :only => [:the_action, :another_action]
另一方面,您还可以提供:except => :this_action
选项
在filter之前使用一个可选块,该块传递给当前控制器实例,这样你就可以这样做:
before_filter :do_stuff, lambda { |controller| controller.logged_in? }
如果您确实不希望为登录用户以外的任何人执行before_filter
,请考虑在身份validationfilter中使用#skip_before_filter
。 例如,如果您在检查用户是否在身份validationfilter中登录时,如果身份validation失败,则只需调用skip_before_filter :filter_for_logged_in_users_only
。
除此之外,您可以在执行仅限成员filter之前测试用户是否已登录。 例如:
def filter_for_logged_in_users_only return true unless current_user && logged_in? #rest of the logic end
如果您使用的是restful身份validation,那就是before_filter :login_required
。 如果您使用自己的身份validation框架,则可以在application.rb中创建一个方法,如果用户已登录则返回true,否则返回重定向到登录页面。
class LoginsController < ApplicationController skip_before_filter :require_login, :only => [:new, :create] end