我有一个代码片段,用于进行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
变量?
答案 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