我希望以更好的方式将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下一个电话,我必须将一个酒店传递到下一页。哪种方法最好?
注意:这只是一个示例。酒店提供许多信息,包括可用房间,折扣等。
答案 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,事实并非如此。
还有其他几种选择(按复杂程度排序):
实际上没有太多数据,它应该适合简单的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 %>
将信息编码为相应的酒店DOM元素作为数据属性:
<div class="hotel" data-id="112" data-hotel-name="Mauria" ... />
然后通过订阅点击事件,读取存储在相应数据属性中的信息并用详细信息div替换列表,在客户端没有服务器的情况下呈现详细信息页面。
如果第三方API是公开的,您甚至可以将搜索问题完全移至客户端。
在服务器上引入搜索请求的缓存。然后从缓存中选择一家酒店 由它的身份。这将节省您从Rails应用程序执行的大量第三方请求,如果部署在典型的多进程服务器上,这是Rails的弱点。
最简单的方法是将最后的搜索结果存储在用户会话中,但是 可能会太沉重。如果您可以预期酒店信息不会经常更改,您可以通过查询参数进行缓存。您还可以使用像redis这样的智能缓存存储并索引整个酒店信息,而不是在缓存上执行搜索,只有在缓存未命中时才会触及第三方API。但请记住,缓存很容易,到期很难。
“Everyone should be using low level caching in Rails”可能对实现缓存感兴趣。
答案 2 :(得分:1)
实现这一目标的一种最佳方式是马克·托马斯所建议的。
但是,如果您仍然需要在页面之间传递数据,则可以将所有xml信息作为字符串放在会话变量中,并在下一页上使用它。