1

我有一个代码片段,它进行 API 调用,目前在 3 个不同的视图文件(都属于不同的控制器)中使用。

我的代码:

<%  url_raw = URI.parse("url-tem_id=#{rec.id}") %>
<%  url = Net::HTTP.get_response(url_raw).body %>
<%  if url.empty? %>
    <%  @title          = "Product Unavailable via API" %>
    <%  @url            = "url" %>
    <%  @cover_img      = "180X180.jpg" %>
    <%  @price          = "Product Unavailable via API" %>
<% else %>
<%  begin %>
<%  @response1  = JSON.parse(url) %>
<%  @title          = @response1["ProductName"]%>
<%  @url            = "{@response1["ProductUrl"]}"%>
<%  @cover_img      = @response1["ImagePath"].gsub("75X75.gif", "500X500.jpg")%>
<%  @price          = @response1["currentItemPrice"]%>
<%  rescue %>
<%  end %>
<%  end %>

我真的很困惑是否应该将其移至部分、帮助程序或应用程序控制器?另外,一旦移动它,我如何在我的视图中调用它并传递rec.id变量?

4

2 回答 2

1

我认为这应该都是模型逻辑......这一切似乎都与设置模型的属性有关。

我假设“rec”是某种描述的模型,在这种情况下:

# all psuedo-code... written off the top of my head and cut/pasting your example... ie: untested!
class Rec < AR::Base
  attr_reader :title, :url, :cover_img, :price

  def call_api!
    url_raw = URI.parse("url-tem_id=#{self.id}")
    url = Net::HTTP.get_response(url_raw).body
    if url.empty?
      @title          = "Product Unavailable via API"
      @url            = "url" 
      @cover_img      = "180X180.jpg" 
      @price          = "Product Unavailable via API" 
    else 
      begin 
        response = JSON.parse(url)
        @title          = response["ProductName"]
        @url            = response["ProductUrl"]
        @cover_img      = response["ImagePath"].gsub("75X75.gif", "500X500.jpg")
        @price          = response["currentItemPrice"]
      rescue 
    end 

  end
end

然后在您的控制器中,您可以调用“rec.call_uri!”,并且视图可以访问“rec.price”等(个人而言,我会稍有不同,但这显示了您拥有的代码的第一阶段重构)。

如果您在多个模型中需要它,请将其提取到一个模块中并包含它。

于 2013-02-23T12:42:46.003 回答
-1

这是控制器逻辑,应该移动到一个模块中,然后控制器可以共享该模块。

您可以创建一个可供您的视图访问的新实例变量。

@rec_id = rec.id

于 2013-02-22T19:47:21.100 回答