2016-08-31 5 views
0

나는 백엔드에서 타사와 통합되는 레일 응용 프로그램을 만들고 있습니다. 간략한 개요를 보려면 사용자가 웹 인터페이스에서 주문을 작성하면 지연된 작업이 지속됩니다. 따라서 작업은 웹 컨텍스트 외부에서 실행되며이 제 3 자에게 요청을 보냅니다. 타사는 요청 본문에 XML 페이로드가있는 POST를 기대합니다.레일에서 템플릿을 사용하여 XML 요청 페이로드 생성

저는 현재 요청을하기 위해 패러데이를 사용하고 있습니다.

class FooRequest 
    def response 
    connection.post("/foo", xml) 
    end 

    private 

    def xml 
    xml = Builder::XmlMarkup.new 
    xml.root do 
     xml.foo "something something" 
    end 

    xml.target! 
    end  

    def connection 
    @connection ||= Faraday.new(url: "http://example.org") 
    end 
end 

는 XML이 실제로 더 크고보다 더 복잡하고 그래서이 클래스에서 XML을 구축하고 싶지 않은 : 내가 이렇게 보이는 클래스가 있습니다. 나는 일종의 템플릿을 갖는 것이 최선이라고 생각합니다. 나는 xml.builder 파일에서 Builder를 사용하거나 원시 파일을 erb 파일에 가지고 싶습니다. 어떤 것이 가장 좋고이 컨텍스트에서 템플릿을 렌더링하는 것이 가장 좋은지 확실하지 않습니다. 나는 레일이 컨트롤러 컨텍스트 (https://medium.com/evil-martians/new-feature-in-rails-5-render-views-outside-of-actions-2fc1181e86a8#.s344qg5ue) 외부에서 뷰를 렌더링하는 기능을 추가했음을 알고 있지만이 기능이이 사용 사례를 위해 구축되지 않은 것 같아요. 나는 또한 Liquid와 같은 다른 템플릿 언어가 있다는 것을 알고있다. 그리고 아마도 그것은 더 잘 맞을 것이다.

과거에 이런 종류의 일을 한 사람이 있습니까? 내가 빠진 것이 있습니까? 또한 템플릿 파일을 만들면 /app/views에 넣어야합니까? 내 웹 응용 프로그램에서 렌더링 할보기가 아니며 /app/templates 디렉토리가 있어야 할 수도 있습니다.

추 신 : 레일즈의 to_xml 메서드는 내가 원하는 것만 큼 강력하지 않습니다 (태그 속성이 필요하고 루비 해시가있는 복잡한 XML 트리를 나타내고 싶지 않습니다).

답변

1

필자도 비슷한 일을했다. 필자가 발견 한 가장 쉬운 방법은 필자가 분리 된 보석에 필요한 XML 클래스를 구현하는 것이다 (실제로이 작업을 수행 할 필요는 없다. 모델 폴더에 클래스를 추가 할 수있다. , 그것은 나의 유스 케이스에 대해 의미가 있었다).

여기에 ROXML을 사용했습니다. 그 후 간단하게 root.to_xml.to_s을 호출하여 문자열을 렌더링 할 수 있습니다. github의 예제를 보면 정말 간단합니다.

+0

렌더링 할 필요가있는 XML의 각 태그에 대해 클래스를 만드는 것을 주저했지만 코드는 정말 멋지게 보입니다. 감사 –

관련 문제