1

私はこのスーパークラスを持っています

# 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

私がやりたいのはto_cte、サブクラス オブジェクトを呼び出したら、属性の値を返すようにすることですが、それぞれに関数を適用した後でのみです。最初にそれらの値を正規化したいと思います (文字列からアクセントを削除する、引用符をエスケープする、特殊文字などを削除する)。この場合、どうすればよいでしょうか?

4

1 に答える 1

0

ここに示したコードには明らかに多くの欠落があります。エンティティオブジェクトに特定の「属性」があると思いますが、これは へのチェーンによって定義されているだけattr_accessorです。の特定のサブクラス (またはサブクラス) で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_accessor、独自の同等の「クラス マクロ」を定義して、リーダーに特別な動作を追加します。

更新:あなたのコメントから、のすべてのサブクラスEntitadeCteが属性の同じ特別な処理を必要とするように思えます。そうですか?その場合、cte_attrスーパークラスの の定義を上記のサンプル コードのようなものに変更するだけです。

または、(スーパークラスで) 定義して、属性値を正規化するものと正規化しないものの2 つcte_attrのリーダー メソッドを生成することもできます。次に、「正規化された」属性リーダーを使用するメソッドを記述します。to_cte

あらゆる種類のオプションがあります。ここで提示した選択肢がニーズに合わない場合は、何をしたいのかをより具体的にする必要があります。一部のサブクラスが「正規化された」属性を使用することになっているのに対し、他のサブクラスは「正規化されていない」属性を使用することが想定されているという問題はありますか? それとも、「正規化」を動的にオン/オフしたいという問題ですか?

于 2012-09-11T14:31:55.193 に答える