自定义过滤器 - 在哪里写这段代码?

时间:2013-09-16 20:07:08

标签: ruby-on-rails

我有一个由Devise生成的用户模型。所以,我之前有过滤authenticate_user。

我使用了STI并创建了另外两个模型UserA<用户,用户B<用户。

用户有一个字段'type',用于确定用户对象是“UserA”还是“UserB”类型。

我有一些控制器,其中我想要特定的过滤器,例如,只能由用户类型'UserA'或UserB看到。所以,我想写一个这样的过滤器:

def authenticate_usera
    if current_user.type == 'usera'
        return true
    else
        return false
end

def authenticate_userb
    if current_user.type == 'userb'
        return true
    else
        return false
end

问题:
那么,我应该在哪里放置此过滤器代码?而且,我可以在控制器中使用这样的:
     before_filter:authenticate_usera

此外,我是否需要使用“require”之类的内容来获取该过滤器?

1 个答案:

答案 0 :(得分:0)

ApplicationController添加以下功能:

def only_allowed_for(user_type_class)
  unless current_user.is_a?(user_type_class)
    redirect_to root_path, :notice => 'Access to the page is not allowed'
  end
end

在我的测试中,我假设通过STI,当前用户将拥有正确的类。我对此并不完全确定(这可能取决于设计如何创建用户)。但你明白了。

然后,在任何控制器中,您可以编写以下内容:

class PostsController < ApplicationController

  before_filter :authenticate_user!
  before_filter { |c| c.only_allowed_for(UserA) }

end

正如您所知:您可以编辑允许哪些类访问。 如果不允许访问,这将重定向到root。