1

@rubiiiは、Savonリクエストをカスタマイズできることを以前に示しました( Savon石鹸本体の問題)。

class SomeXML
  def self.to_s
    "<some>xml</some>"
  end
end

client.request :some_action do
  soap.body = SomeXML
end

しかし、なぜこのようなクラスメソッドを使用するのでしょうか。クラスのインスタンスに、それ自体をリクエスト本文のハッシュに変換するように依頼する可能性が高くなります。すなわち

@instance = SomeClass.new

client.request :some_action do
  soap.body = @instance.to_soap
end

ただし、これを実行しようとすると、@instance変数がリクエストブロック内の「スコープ」にありません。そのため、nilでメソッドto_soapを呼び出すことができません。しかし、代わりにクラスメソッドを使用すると、それを機能させることができます。すなわち

class SomeClass
  @@soap_hash = nil

  def self.soap_hash=(hash)
    @@soap_hash = hash
  end

  def self.soap_hash
    @@soap_hash
  end
end

SomeClass.soap_hash = @instance.to_soap

client.request :some_action do
  soap.body = SomeClass.soap_hash
end

理解できません?

4

1 に答える 1

1
  1. クラスメソッドの例はまさにその例です。に応答するオブジェクトを自由に使用してto_sください。

  2. ブロックは、委任を使用してinstance_evalを介して処理されます。そのため、ブロック内でのみローカル変数とメソッドを使用できます。インスタンス変数を使用する必要がある場合は、引数を受け入れるようにブロックを変更してください。Savonは、ブロックを評価する代わりに、引数を指定してそれらの値を生成したことに気付きます。

具体的な引数やその他すべてについては、RTFMをご覧ください;)

于 2011-10-21T09:26:14.863 に答える