传递实例变量以进行查看

时间:2013-02-14 07:51:22

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 ruby-on-rails-3.2

我在我的控制器中进行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>

这只显示收到的一个回复。如何显示我视图中收到的所有回复。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 %>