Ruby 如何将函数应用于每个类属性值?

Ruby 如何将函数应用于每个类属性值?,ruby,xml-serialization,metaprogramming,Ruby,Xml Serialization,Metaprogramming,我有一个超级班 # encoding: utf-8 class EntidadeCte include ROXML include ActiveModel::Validations class << self # apelida o xml_accessor do ROXML para cte_attr alias :cte_attr :xml_accessor # define um accessor ruby comum para os

我有一个超级班

# encoding: utf-8

class EntidadeCte

  include ROXML
  include ActiveModel::Validations

  class << self
    # apelida o xml_accessor do ROXML para cte_attr
    alias :cte_attr :xml_accessor

    # define um accessor ruby comum para os atributos do cte
    def xml_accessor(*attrs)
      attr_accessor *attrs
    end

    # todos os atributos da entidade
    def cte_attrs
      roxml_attrs.map(&:attr_name)
    end

  end

  # todos os atributos da entidade do objeto
  def cte_attrs
    self.class.cte_attrs
  end

  # retorna o xml representando a entidade
  def to_cte
    doc = Nokogiri::XML::Document.new
    doc.root = to_xml
    doc.serialize
  end

  # retorna o xml ou delega a classe herdada
  def to_s
    self.respond_to? :to_cte ? to_cte : super
  end

end
这个子类呢

# encoding: utf-8

    class TagCte < EntidadeCte

      def initialize
        self.xmlns = "http://www.portalfiscal.inf.br/cte"  
      end

      xml_name :CTe

      cte_attr :xmlns, :from => "@xmlns"
      cte_attr :infCte, :as => ConhecimentoTransporte

    end

我想做的是,一旦我在我的子类对象上调用_cte,它将返回其属性的值,但只有在对每个属性应用函数之后。我想规范化它们的值,首先从字符串、转义引号、特殊字符等中删除重音符号。在这种情况下,我将如何做到这一点?

这里显示的代码显然缺少很多内容。我猜想您的实体对象上有某些属性,这些属性只是通过链接到attr_访问器来定义的。在EntitadeCte的一个或多个子类中,您希望对这些属性应用一些特殊行为

子类的所有属性都是直接在该子类中定义的吗?还是有些是遗传的

如果它们是直接在子类中定义的,则可以在子类中简单地重新定义cte_attr,如下所示:

class Subclass < EntitadeCte
  def self.cte_attr(*attrs)
    attrs.each do |attr|
      attr_writer(attr)
      class_eval("def #{attr}; do something special to @#{attr} here; end")
    end
  end
end
因此,您不需要使用attr_访问器,而是定义自己的等效类宏,从而为读取器添加一些特殊行为

更新:从您的评论来看,EntitadeCte的所有子类似乎都需要对属性进行相同的特殊处理。是这样吗?在这种情况下,您可以将超类中cte_attr的定义更改为类似上面的示例代码

或者,您可以在超类中定义cte_attr以生成两个读取器方法,一个用于规范化属性值,另一个不规范化属性值。然后编写一个使用规范化属性读取器的to_cte方法


有各种各样的选择。如果我在这里给你的选择不符合你的需要,那么你需要更具体地说明你想要做什么。问题是一些子类应该使用规范化属性,而其他子类应该使用非规范化属性?或者问题是您想动态地打开和关闭规范化?

我有几个EntityDecte子类,它们的所有属性都用cte_attr:subclass attrs标记。这些子类代表了我们巴西政府使用的非常复杂的XML结构,是的,它们彼此关联,所以我所要做的就是调用我的根对象以获得整个XML。我正在做的是设置这些attrs值,以便生成必须通过SOAP发送的XML。我正在寻找一种解决方案,它不需要我更改每个子类中的代码。只是为您添加了更多选项。最终在我的超类中创建了另一个attr_读取器,并在内部使用它,如您所说的第二个选项。谢谢你的帮助,我很感激!