2016-08-31 4 views
0

Я работаю над приложением rails, которое интегрируется с сторонней стороной на бэкэнд. Чтобы дать краткий обзор, пользователь создаст заказ в нашем веб-интерфейсе и будет продолжать работу с задержкой. Таким образом, работа выполняется за пределами веб-контекста и отправляет запрос этой третьей стороне. Третья сторона ожидает POST с полезной нагрузкой XML в теле запроса.Создайте полезную нагрузку запроса 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 в этом классе. Я думаю, что иметь какой-то шаблон лучше. Я хотел бы использовать Builder в файле xml.builder или просто иметь необработанный XML в файле erb. Не уверен, что лучше всего и как лучше всего сделать шаблон в этом контексте. Я знаю, что рельсы недавно добавили возможность визуализации представлений вне контекста контроллера (https://medium.com/evil-martians/new-feature-in-rails-5-render-views-outside-of-actions-2fc1181e86a8#.s344qg5ue), но я чувствую, что эта функция не была построена для этого варианта использования. Я также знаю, что есть другие шаблонные языки, такие как Liquid, и, возможно, это лучше подходит.

Неужели кто-нибудь делал подобные вещи в прошлом? Есть что-то, что мне не хватает? Кроме того, если я создаю файл шаблона, я должен положить его в /app/views? Это не мнение, что мой webapp будет делать, может быть, у меня должен быть /app/templates dir?

PS: Метод Rails to_xml не достаточно прочен для того, что я хочу (мне нужны атрибуты тегов, и я не хочу представлять глубокое сложное дерево XML с хэш-рубином).

ответ

1

Я сделал аналогичную вещь, самым простым способом, который я нашел, было реализовать любые XML-классы, которые мне нужны, в отдельный драгоценный камень (вам действительно не нужно это делать, вы можете просто добавить классы где-нибудь в папке моделей , это имело смысл для моего случая использования).

Я использовал ROXML для этого; после этого вы можете просто позвонить root.to_xml.to_s, чтобы отобразить вашу строку, см. примеры на github, это очень просто.

+0

Я был немного нерешительным, чтобы создать класс для каждого тега в XML, который мне нужно было визуализировать, но код оказался действительно замечательным. благодаря –