1

現在、3 つの異なるビュー ファイル (すべて異なるコントローラーに属しています) で使用されている API 呼び出しを行うコード スニペットがあります。

私のコード:

<%  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」などにアクセスできます(個人的には少し異なる方法で行いますが、これはコードの第1段階のリファクタリングを示しています)。

複数のモデルで必要な場合は、モジュールに抽出して含めます。

于 2013-02-23T12:42:46.003 に答える
-1

これはコントローラー ロジックであり、コントローラーで共有できるモジュールに移動する必要があります。

ビューにアクセスできる新しいインスタンス変数を作成できます。

@rec_id = rec.id

于 2013-02-22T19:47:21.100 に答える