从一页其他页面传递XML值

时间:2014-06-02 10:50:11

标签: ruby-on-rails ruby nokogiri

我希望以更好的方式将XML值从一个页面传递到另一个页面。

我从API获取此XML值:

<hotelist>
  <hotel>
    <hotelId>109</hotelId>
    <hotelName>Hotel Sara</hotelName>
    <location>UK,london</location>
  </hotel>
  <hotel>
    <hotelId>110</hotelId>
    <hotelName>Radha park</hotelName>
    <location>UK,london</location>
  </hotel>
  <hotel>
    <hotelId>111</hotelId>
    <hotelName>Hotel Green park</hotelName>
    <location>chennai,India</location>
  </hotel>
  <hotel>
    <hotelId>112</hotelId>
    <hotelName>Hotel Mauria</hotelName>
    <location>paris,France</location>
  </hotel>   
</hotelist>

我想通过一家酒店:

<hotel>
  <hotelId>112</hotelId>
  <hotelName>Hotel Mauria</hotelName>
  <location>paris,France</location>
</hotel>   

到下一页。

我正在使用Nokogiri gem来解析XML。对于API下一个电话,我必须将一个酒店传递到下一页。哪种方法最好?

注意:这只是一个示例。酒店提供许多信息,包括可用房间,折扣等。

3 个答案:

答案 0 :(得分:1)

如果您不介意在查询参数中传递所有信息:

links = doc.xpath('//hotel').map do |hotel|
  hash = Hash.from_xml(hotel.to_xml)
  url_for({controller: 'x', action: 'y'}.merge(hash))
  # or if you have your link as a string
  # "#{link_string}?#{hash.to_param}"
end

如果您只想为一家酒店创建链接,请提取相关的XML(例如,使用Uri的答案中描述的流程),然后生成上述链接。

假设您在呈现当前页面之前已准备好API XML,您可以将相关的酒店数据呈现到表单字段中,以便post到下一页,例如:

<%= fields_for :hotel do |hf| %>
  <% hf.hidden_field :hotelId, value: hash['hotel']['hotelId'] %>
  # ...
<% end %>

答案 1 :(得分:1)

因此,就此而言,您正在通过第三方服务搜索某些酒店,然后显示列表。用户单击您显示详细信息的项目后 为酒店。

最简单的方法是使用另一个API端点,它可以提供特定酒店ID的详细信息。我想你正在处理一些非常糟糕的API,事实并非如此。

还有其他几种选择(按复杂程度排序):

  1. 实际上没有太多数据,它应该适合简单的GET请求,因此您可以将相应的酒店信息编码为详细信息的URL参数 页。假设您已经设置了资源丰富的路由,并且已经将XML解析为某些酒店模型/结构的@hotels数组等:

    <% @hotels.each |hotel| do %>
      <% # generates <a href=/hotels/112?hotelName=Hotel+Mauria&location=paris%2C+France'>Hotel Mauria</a>
      <%= link_to hotel.hotelName hotel_path(hotel.hotelId, hotelName: hotel.hotelName, location: hotel.location) %>
    <% end %>
    
  2. 将信息编码为相应的酒店DOM元素作为数据属性:

    <div class="hotel" data-id="112" data-hotel-name="Mauria" ... />
    

    然后通过订阅点击事件,读取存储在相应数据属性中的信息并用详细信息div替换列表,在客户端没有服务器的情况下呈现详细信息页面。

    如果第三方API是公开的,您甚至可以将搜索问题完全移至客户端。

  3. 在服务器上引入搜索请求的缓存。然后从缓存中选择一家酒店 由它的身份。这将节省您从Rails应用程序执行的大量第三方请求,如果部署在典型的多进程服务器上,这是Rails的弱点。

    最简单的方法是将最后的搜索结果存储在用户会话中,但是 可能会太沉重。如果您可以预期酒店信息不会经常更改,您可以通过查询参数进行缓存。您还可以使用像redis这样的智能缓存存储并索引整个酒店信息,而不是在缓存上执行搜索,只有在缓存未命中时才会触及第三方API。但请记住,缓存很容易,到期很难。

  4. Everyone should be using low level caching in Rails”可能对实现缓存感兴趣。

答案 2 :(得分:1)

实现这一目标的一种最佳方式是马克·托马斯所建议的。

但是,如果您仍然需要在页面之间传递数据,则可以将所有xml信息作为字符串放在会话变量中,并在下一页上使用它。