如何在一个rails控制器中使用两个Devise的before_filters?

时间:2013-05-16 17:29:49

标签: ruby-on-rails devise

如果我在我的应用程序中有两个角色,一个是admin,另一个是用户,现在我想让他们两个都能够访问控制器操作,我应该怎么做?

class FooController < ApplicationController
  #before_filter is used here,but how?
  def methodA     #index  or new...
    ...
  end
  def methodB     #show  or  edit...
    ...
  end
  ...
end 

有一些由Devise创建的助手:

before_filter :authenticate_admin! 

admin_signed_in?

current_admin

admin_session

在这些助手中,“admin”可以更改为“user”。

4 个答案:

答案 0 :(得分:4)

如果我理解得很好,你就会有一个设计模型。每个帐户都以某种方式标记为用户或管理员。因此,只要访问者通过身份验证,就可以允许他/她访问控制器的方法。

在您的控制器中,添加 before_filter: authenticate_user! (如果你的设计模型被称为'用户'),那就足够了。

现在,如果你有两个模型(每个角色一个),你可以试试这个:

before_filter :deny_to_visitors

private

def deny_to_visitors
  redirect_to root_path unless user_signed_in? or admin_signed_in?
end

答案 1 :(得分:0)

我想你可能会使用cancan gem。 Devise主要用于身份验证,但cancan可以更好地处理用户权限。

答案 2 :(得分:0)

我不完全确定你在问什么。 methods A & B控制器是否有动作?如果是这样,Devise生成的助手使用适当的模型名称。例如:

 before_filter :authenticate_model_name!

因此,如果您有User modelAdmin model,则可以同时使用:

before_filter :authenticate_user!, only: [:destroy, etc]
before_filter :authenticate_admin!, only: [:destroy, etc]

答案 3 :(得分:-1)

这个怎么样:使用一个方法,但在该方法中调用第二个方法。

before_filter :methodA

def methodA  
   #call method B from here
end


def methodB  
   return true | false or something
end