使用Ruby on Rails,我想在过滤动作之前,但仅在用户登录时才这样做。
这怎么可能?
答案 0 :(得分:18)
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
选项
答案 1 :(得分:16)
我认为你只是在用户登录时才询问如何运行 a过滤器。这里没有内置语义,但内联很容易:
class SomeController < ApplicationController
before_filter :do_something
def do_something
if logged_in?
# the stuff you want to do
end
end
end
答案 2 :(得分:11)
在过滤器之前取一个可选块,该块传递当前控制器实例 所以你可以这样做:
before_filter :do_stuff, lambda { |controller| controller.logged_in? }
答案 3 :(得分:2)
如果您确实不希望为登录用户以外的任何人执行before_filter
,请考虑在身份验证过滤器中使用#skip_before_filter
。例如,如果您在检查用户是否已在身份验证过滤器中登录时,如果身份验证失败,则只需调用skip_before_filter :filter_for_logged_in_users_only
。
除此之外,您可以在执行仅限会员过滤器之前测试用户是否已登录。例如:
def filter_for_logged_in_users_only
return true unless current_user && logged_in?
#rest of the logic
end
答案 4 :(得分:1)
如果您使用的是restful身份验证,那只是before_filter :login_required
。如果您使用自己的身份验证框架,则可以在application.rb中创建一个方法,如果用户已登录则返回true,否则重定向到登录页面。
答案 5 :(得分:0)
class LoginsController < ApplicationController
skip_before_filter :require_login, :only => [:new, :create]
end