2

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在任何子控制器check_permissionsnil,我检查了哪些实例方法可用:print self.instance_variables@perms没有出现;可能是因为@perms正在为类实例设置而不是为调用操作时创建的控制器的对象实例

这是怎么回事?导轨不喜欢attr_accessor控制器吗?我怎样才能让它工作,这样我就可以在类中设置权限,并让该类的任何对象可以访问它们,这样我就可以像这样设置它们:

class Api::ApiController < ApplicationController

    set_permissions :api
    before_action :check_permissions, except: :set_permissions

end

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

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

4

1 回答 1

2

你在定义

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

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

如果您想设置类级别权限,我建议您使用cattr_accessor. 检查它的instance_readerinstance_writer选项。

于 2014-05-20T12:15:44.763 回答