我在我的控制器中使用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控制器,但需要获得权限,因此一个人实际上可以获得令牌而无需权限。)
答案 0 :(得分:2)
您正在定义
def self.set_permissions *permissions
self.perms = permissions
end
这是一个类级方法,而attr_accessor
是实例级别。
如果您希望设置班级权限,我建议您使用cattr_accessor
。检查其instance_reader
和instance_writer
选项。