2012-05-10 3 views
1

私はActiveResourceで簡単に接続できる非Rails RESTful APIを手に入れました。見つけたときにデータを取得するだけで動作します。しかし、データの更新はそれほど簡単ではありません。私は、APIがGETリクエストがに包まれているものです<platform_user>ではなく<hash>のこの非標準のXMLタグに包まれたXML本体を望んでいるからだと思います。update_attributesをRESTful APIにすると、XMLタグをどのように変更できますか?

update_attributesをやったときにどのように私は、基本的なXMLテンプレートを変更しますので、 <platform_user>を含めることができますか?

一般に、私はこのようにActiveResourceを使用することに関する多くのガイダンスを見つけることができませんでした。あなたが私に指すことができる書籍やウェブサイトはありますか?

ありがとうございました。

答えて

1

変更

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

あなたの問題は、単に名前の変更やラッピング親ノード内で、私はあなたが行っていると仮定していることによって解決される場合、私は実際には非常に驚かれることと思いますあなたが解決策に近づくにつれて、より多くの問題にぶつかることができます。私は(残念ながら)この船に乗っていたので、私が学んだことを書いています。

一般的に、サービスでは、複雑なXMLまたはその他の醜いXMLが予想される場合、ActiveResourceを使用してサービスを処理することはやや難しいことがわかりました。これらのケースでは、作成(POST)または更新(PUT)が内部的にオブジェクトのto_xmlを呼び出してデータをXMLにシリアル化する必要があるため、これらのケースでは私のソリューションは必然的にオブジェクトのto_xmlメソッドをオーバーライドします。上記の方法は、ルビーのxmlビルダーを利用することもできますし、もっと面倒なものには 'here document'を使うこともできます。私は結論は、を正確にあなたのサービスが期待していることを知っていると思うし、サービスに送信するためにその構造を構築することです。 「ここでの文書は」非友好的な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 

幸運。

0

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

class PlatformUser < ActiveResource::Base 

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

platform_user_attrs = { :name => "foo", :level => 15 } 
platform_user = PlatformUser.new(platform_user_attrs) 
関連する問題