1

ActiveResource で簡単に接続できる Rails 以外の RESTful API を持っているので、検索時にデータを取得するだけで簡単に機能します。ただし、データの更新はそれほど簡単ではありません。これは、API が、GET 要求がラップされているものでは<platform_user>なく、この非標準の XML タグでラップされた XML 本体を望んでいるためだと思います 。<hash>

update_attributes を実行するときに、基本的な XML テンプレートをどのように変更して<platform_user>

そして一般的に、この方法で ActiveResource を使用する方法については、あまりガイダンスを見つけることができませんでした。参考になる本やウェブサイトはありますか?

どうもありがとう。

4

2 に答える 2

1

親ノード内で名前を変更したりラップしたりするだけで問題が解決する場合は、実際には非常に驚きます。解決策に近づくにつれて、サービスでさらに多くの問題が発生することになると思います。私は(残念ながら)以前にこのボートに乗ったことがあるので、学んだことを書いています。

一般に、サービスが複雑なXMLや醜いXMLを予期している場合、ActiveResourceを介してサービスを処理するのはやや難しいことがわかりました。これらの場合の私のソリューションは、必然的にオブジェクトのto_xmlメソッドをオーバーライドすることになります。これは、作成(POST)または更新(PUT)がオブジェクトのto_xmlを内部的に呼び出して、データをXMLにシリアル化する必要があるためです。これらのメソッドは、rubyのxmlビルダーを利用することも、さらにトリッキーなものに「ヒアドキュメント」を使用することもできます。肝心なのは、サービスが何を期待しているのかを正確に把握し、その構造を構築してサービスに送信する必要があるということです。

たとえば、「ヒアドキュメント」を使用して、わかりにくいxml構造を強制します。

class User << ActiveResource::Base

  def to_xml
    xml =<<-EOS
      <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <platform_user>
        <user xsi:type="userData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
          <userId>#{self.id}</userId>
          <userName>#{self.name}</userName>
          <addresses>
            <address>
              <address1>#{self.address1}</address1>
              <addressZip>#{self.zip}</addressZip>
            </address>
          </addresses>
        </user>
      </platform_user>
    EOS
    xml.gsub(/\n|\t|\r/,"").strip #clean it up.
  end
end

XML Builderを使用して、構造に合わせて機能させることもできます。次に例を示します。

def to_xml
  xml = Builder::XmlMarkup.new()
    xml.instruct! :xml, :version => "1.0", :encoding => "UTF-8", :standalone=>"yes"
    xml.platform_user do
        xml.user do
          xml.userId self.id
          ...
        end
    end
end 

幸運を。

于 2012-05-26T23:53:29.237 に答える
0

PlatformUser のクラスを作成してみてください。

class PlatformUser < ActiveResource::Base

次に、ハッシュを入力する代わりに、これらの値を使用してこのオブジェクトの属性を設定します。

変化する

platform_user_data = { :name => "foo", :level => 15 }

platform_user_attrs = { :name => "foo", :level => 15 }
platform_user = PlatformUser.new(platform_user_attrs)
于 2012-05-10T17:51:14.630 に答える