0

我在我的控制器中进行了一个 API 调用,它返回一个记录列表,并将响应设置为等于我在视图中调用的实例变量。

我的控制器:

@products = Product.find(:all)
    @products.each do |product|
        url          = URI.parse("url{product.id}")
        @response1      = JSON.parse(Net::HTTP.get_response(url).body)
        puts @response1
        @title          = @response1["ProductName"]
        @url            = @response1["ProductUrl"]
    end

我的观点:

<div class= "title"><small><b><%= link_to truncate( @title, :length =>30), :target => '_blank' %></b></small></div>

这仅显示收到的响应之一。如何显示在我的视图中收到的所有回复。

4

2 回答 2

0

您可以直接在视图中执行,而不是迭代控制器中的响应。

但是,最好在控制器中组装一个数组并在视图中对其进行迭代,这样可以避免给视图过多的责任,例如:

@products = Product.find(:all)
@products_with_Responses = @products.map do |product|
  url = URI.parse("url{product.id}")      
  response = JSON.parse(Net::HTTP.get_response(url).body) 
  {:title          => response["ProductName"],
   :url            => response["ProductUrl"]}
end
于 2013-02-14T07:55:21.183 回答
0

您在 @products.each 的每次迭代中重新分配 @response1 和所有其他变量,因此它具有最后一个产品的值。在输出期间,您必须在视图内执行此类循环。

像这样:

<% @products.each do |product| %>
  <% @response1 = JSON.parse(Net::HTTP.get_response(URI.parse("url{product.id}")).body) %>
  <div class= "title">
    <small>
      <b>
        <%= link_to truncate( @response1["ProductName"], :length =>30), @response1["ProductUrl"], :target => '_blank' %>
      </b>
    </small>
  </div>
<% end %>
于 2013-02-14T07:56:37.253 回答