控制器中的attr_accessor用于存储权限

时间:2014-05-20 11:24:48

标签: ruby-on-rails attr-accessor

我在我的控制器中使用attr_accessor存储权限,这些权限是在applicationController中定义的方法中设置的,但我遇到了问题。 如果我这样做:

class ApplicationController < ActionController::Base

    attr_accessor :perms

    def self.set_permissions *permissions
      self.perms = permissions
    end

    def check_permissions
        print self.perms
    end

end

然后rails声称perms=不存在

如果我这样做:

class ApplicationController < ActionController::Base

    attr_accessor :perms

    def self.set_permissions *permissions
      @perms = permissions
    end

    def check_permissions
        print @perms
    end
end
@perms中{p> check_permissions在任何子控制器中都是nil,我使用print self.instance_variables检查了可用的实例方法,但@perms没有&#39;出现;可能是因为正在为类实例设置@perms而不是在调用操作时创建的控制器的对象实例

怎么回事? rails在控制器上不像attr_accessor吗?我怎样才能使这个工作,所以我可以在类中设置权限,让它们可以访问该类的任何对象,所以我可以像这样设置它们:

class Api::ApiController < ApplicationController

    set_permissions :api
    before_action :check_permissions, except: :set_permissions

end

我必须使用self.set_permissions,否则它声称当我尝试设置它们时,set_permissions不存在(因为它是一个对象方法而不是类方法)

编辑: 为了澄清,我希望在控制器中设置权限(但对于每个控制器都是不同的);对于该控制器的任何实例(即为操作创建的对象实例)或从该控制器继承的任何控制器(例如,节点控制器继承自api控制器并因此使用相同的权限),它们是相同的,除非它是&#39;已经在该继承的控制器中单独定义(令牌控制器继承自api控制器,但需要获得权限,因此一个人实际上可以获得令牌而无需权限。)

1 个答案:

答案 0 :(得分:2)

您正在定义

def self.set_permissions *permissions
  self.perms = permissions
end

这是一个类级方法,而attr_accessor是实例级别。

如果您希望设置班级权限,我建议您使用cattr_accessor。检查其instance_readerinstance_writer选项。