Ruby on Rails:before_filter => :only_when_user_is_logged_in

时间:2009-12-13 05:37:18

标签: ruby-on-rails

使用Ruby on Rails,我想在过滤动作之前,但仅在用户登录时才这样做。

这怎么可能?

6 个答案:

答案 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