我正在尝试创建自己的称为attributes
的{{1}}方法,在该方法中向其传递属性数组和授权用户查看这些属性所需的最低权限。我将当前授权用户的级别作为instance_option传递。我想扩展Serializer类,以便可以在多个序列化器中使用此方法,但是我遇到了问题。
这是我到目前为止所拥有的:
在secure_attributes
config/initializers/secure_attributes.rb
然后在单独的序列化程序中,我会遇到这样的事情:
module ActiveModel
class Serializer
def self.secure_attributes(attributes={}, minimum_level)
attributes.delete_if {|attr| attr == :attribute_name } unless has_access?(minimum_level)
attributes.each_with_object({}) do |name, hash|
unless self.class._fragmented
hash[name] = send(name)
else
hash[name] = self.class._fragmented.public_send(name)
end
end
end
end
end
然后
secure_attributes([:id, :name, :password_hint], :guest)
但是显然secure_attributes无法看到 def has_access?(minimum_level=nil)
return false unless minimum_level
return true # based on a bunch of logic...
end
方法,如果我将has_access?
放在Serializer类中,它就不能访问instance_options。
有什么想法可以完成我所需要的吗?
答案 0 :(得分:1)
也许您想执行以下操作-但我仍然没有真正的目的,因为您从未对属性进行任何操作,只能调用它们:
module ActiveRecord
class JoshsSerializer < Serializer
class << self
def secure_attributes(attributes={}, minimum_level)
@secure_attributes = attributes
@minimum_level = minimum_level
end
attr_reader :minimum_level, :secure_attributes
end
def initialize(attr, options)
super attr, options
secure_attributes = self.class.secure_attributes.dup
secure_attributes.delete :attribute_name unless has_access?(self.class.minimum_level)
secure_attributes.each_with_object({}) do |name, hash|
if self.class._fragmented
hash[name] = self.class._fragmented.public_send(name)
else
hash[name] = send(name)
end
end
def has_access?(minimum_level=nil)
return false unless minimum_level
return true # based on a bunch of logic...
end
end
end