【问题标题】:attr_accessor in controller for storing permissions控制器中的 attr_accessor 用于存储权限
【发布时间】:2014-07-08 15:17:21
【问题描述】:

我在我的控制器中使用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

check_permissions 中的@perms 在任何子控制器中是nil,我检查了哪些实例方法可用:print self.instance_variables@perms 没有出现;可能是因为为类实例设置了@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 控制器继承,因此使用相同的权限)都是相同的,除非它是在该继承的控制器中单独定义的(tokens 控制器继承自 api 控制器,但需要无权限,因此一个人实际上可以在不需要权限的情况下获得令牌。

【问题讨论】:

    标签: ruby-on-rails attr-accessor


    【解决方案1】:

    你正在定义

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

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

    如果你想设置班级级别的权限,我建议你使用cattr_accessor。检查其instance_readerinstance_writer 选项。

    【讨论】:

    • 嗯,刚刚试了一下,效果很好,非常感谢。
    猜你喜欢
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 2013-06-28
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多