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

및 @ 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

컨트롤러의 응답을 반복하는 대신보기에서 직접 수행 할 수 있습니다.

그러나, 컨트롤러에서 배열을 조립하고 당신이 좋아하는 뷰에게 너무 많은 책임을 부여하지 않도록 뷰에서, 그래서 반복하는 것이 좋습니다 것입니다 : 당신은 @의 response1를 재 할당하는

@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

+0

또한, 대신 컨트롤러에서 호출을 제거하고 뷰 내부에 배치하십시오. – Phobos98