干掉我的看法

时间:2013-02-22 19:29:47

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.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变量?

2 个答案:

答案 0 :(得分: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”等(个人而言,我会稍微不同地做,但这显示了第一阶段的重构你有的代码)。

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

答案 1 :(得分:-1)

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

您可以创建一个可供您查看的新实例变量。

@rec_id = rec.id