2012-05-10 3 views
1

ActiveResource를 사용하여 쉽게 연결할 수있는 비 Rails RESTful API가 있으며 찾기 만하면 데이터를 가져 오는 것만으로 간단하게 작동합니다. 그러나 데이터를 업데이트하는 것은 간단하지 않습니다. 나는 API는 GET 요청에 싸여 것입니다 오히려 <hash>보다 <platform_user>의 표준이 아닌 XML 태그에 싸여 XML의 몸을 원하기 때문에 그것은 생각합니다.RESTful API에 update_attributes를 수행 할 때 XML 태그를 어떻게 변경합니까?

을 그래서 update_attributes을 할 때 나는 기본적인 XML 템플릿을 수정 할 방법 <platform_user>을 포함 할 수 있습니까?

일반적으로 ActiveResource를 이런 방식으로 사용하는 것에 대한 많은 지침을 찾을 수 없었습니다. 저를 가리킬 수있는 책이나 웹 사이트가 있습니까?

감사합니다.

답변

1

에 실제로 매우 놀랄 것 솔루션에 더 가까워 질수록 서비스에 더 많은 문제가 발생할 수 있습니다. 나는 (불행하게도)이 배에 타고 있었기 때문에 배운 것을 쓰고있다.

일반적으로 서비스가 복잡하거나 추악한 XML을 기대할 때 ActiveResource를 통해 서비스를 처리하는 것이 다소 어려웠습니다. 이러한 경우 필자의 솔루션은 필연적으로 create (POST) 또는 update (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 작성기를 사용할 수 있습니다

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_data = { :name => "foo", :level => 15 } 

platform_user_attrs = { :name => "foo", :level => 15 } 
platform_user = PlatformUser.new(platform_user_attrs)