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> 

这将显示刚接收到的响应中的一个。如何显示在我的视图中收到的所有回复。

回答

0

您重新分配@响应1和@ products.each的每次迭代中的所有其他变量,因此它具有最后一个产品的值。在输出过程中,您必须在视图内进行这样的循环。

像这样:

<% @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 %> 
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 
+0

因此,我将不得不在我看来也是API调用? – Yogzzz 2013-02-14 07:56:36

+0

不是,但是相反 - 从控制器中删除调用并将它们放入视图中。 – Phobos98 2013-02-14 07:57:14