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