使用自定义属性方法扩展ActiveModel :: Serializer

时间:2018-08-31 19:26:14

标签: ruby-on-rails active-model-serializers

我正在尝试创建自己的称为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。

有什么想法可以完成我所需要的吗?

1 个答案:

答案 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