2016-07-14 5 views
1

のRails 4.2のdevの環境わからないクリーンアップ&Iは、コントローラ<code>Searches</code>を持っている私の、一見難しい解析されたJSONレスポンス

を使用する方法:コントローラはClass_nameクラスオブジェクトのために使用しています

def index 
    @search_term = params[:s] || 'shoes' 
    @listings = Class_name.for(@search_term) 
end 

モデル&オブジェクト際に使用for方法:

class Class_name 
include HTTParty 

base_uri 'http://svcs.ebay.com/services/search/FindingService/v1?SERVICE-NAME=FindingService&OPERATION-NAME=findItemsByKeywords&SERVICE-VERSION=1.13.0&SECURITY-APPNAME=xxxx&RESPONSE-DATA-FORMAT=JSON&REST-PAYLOAD&GLOBAL-ID=EBAY-US&paginationInput.entriesPerPage=25&paginationInput.pageNumber=1' 
format :json 

    def self.for term 
    get("", query: { keywords: term})["findItemsByKeywordsResponse"] 
    end 

end 

最後に、ビュー - 私は表示するテーブルを作成しますeBayのAPIからの解析された応答。

<table border="1"> 
<tr> 
    <th>Image</th> 
    <th>Name</th> 
</tr> 
<% @listings.each do |product| %> 
<tr> 
    <td><%= image_tag(product["searchResult"][0]["item"][0]["galleryURL"])%></td> 
    <td><%= product["searchResult"][0]["item"].sample(25) %></td> 
</tr> 
    <% end %> 
</table> 

私の質問は、モデルとビューです。管理するために、私はbase_uri限りと簡単に持っていないために - - モデルの場合

は、私が default_params HTTPartyメソッドを追加しようとしましたが、私は書くだろうというとき:

default_params SERVICE-NAME: "FindingService", OPERATION-NAME: "#{operation}" ,etc ,etc 

は、それは私にエラーを与えるだろう基本的にのシンボルは定数 "SERVICE-NAME"にできませんが、apiのパラメータは大文字である必要があります/である必要があります。

割り当てられた値がある場合、定数をハッシュ/シンボルと見なすことができないのはなぜですか?大会で事前に割り当てられた価値があると予想されるので、私は推測していますか?

これらの値を、私が今やっているよりも安全な方法で割り当てることはできますか?記号として使用できないのですか? - >>> Starbellyによって回答しました。

また、ユーザーがリダイレクトを行ったかどうかを考慮して、自分のアプリIDを隠すことにメリットがありますか?そうでない場合は、リダイレクトに従う必要はありませんか?

代わりにアフィリエイトIDはどうですか?私は確かに、アフィリエイトIdに、信用を得るために誰かをトラフィックのリンクにリダイレクトするURLの中にとどめる必要があるだろう。

ビューの質問に: これは本当に私にトラブルを与えている部分です。

モデルコードで、あなたがself.for(term)メソッドを参照してくださいので、それは、キーワードを照会するために、あなたがそれを与えるのparamに取り、それは私がしたいfindItemsByKeywordsResponse名前付きの値のJSONフォーマットされた表になり、検索&に必要なPARAMアクセス。それはアイテムの次の配列を繰り返し、上記のコードの最後のコンマの後

{ 
findItemsByKeywordsResponse: [ 
{ 
ack: [ 
"Success" 
], 
version: [ 
"1.13.0" 
], 
timestamp: [ 
"2016-07-11T01:33:40.002Z" 
], 
searchResult: [ 
{ 
@count: "25", 
item: [ 
{ 
    itemId: [ 
     "351198621254" 
      ], 
    title: [ 
     "Black PU Leather High Back Office Chair Executive Task Ergonomic Computer Desk" 
      ], 
    globalId: [ 
     "EBAY-US" 
      ], 
    subtitle: [ 
     "Ship from IN & CA ! Delivery in 1-3 Days US 48 States !" 
       ], 
    primaryCategory: [ 
     { 
     categoryId: [ 
      "61677" 
        ], 
     categoryName: [ 
      "Chairs" 
         ] 
     } 
        ], 
    secondaryCategory: [ 
     { 
     categoryId: [ 
      "54235" 
        ], 
     categoryName: [ 
      "Chairs" 
         ] 
     } 
         ], 
    galleryURL: [ 
     "http://thumbs3.ebaystatic.com/m/mBdjVHSC7hWaSBl-4Ku69aA/140.jpg" 
       ], 
    viewItemURL: [ 
     "http://www.ebay.com/itm/Black-PU-Leather-High-Back-Office-Chair-Executive-Task-Ergonomic-Computer-Desk-/351198621254" 
        ], 
    paymentMethod: [ 
     "PayPal" 
        ], 
    autoPay: [ 
     "true" 
      ], 
    postalCode: [ 
     "91748" 
       ], 
    location: [ 
     "Rowland Heights,CA,USA" 
       ], 
    country: [ 
     "US" 
      ], 
    shippingInfo: [ 
     { 
      shippingServiceCost: [ 
     { 
      @currencyId: "USD", 
       __value__: "0.0" 
     } 
           ], 
    shippingType: [ 
     "Free" 
        ], 
    shipToLocations: [ 
      "US" 
        ], 
    expeditedShipping: [ 
     "true" 
         ], 
    oneDayShippingAvailable: [ 
     "false" 
          ], 
    handlingTime: [ 
     "0" 
        ] 
     } 
        ], 
    sellingStatus: [ 
     { 
     currentPrice: [ 
     { 
     @currencyId: "USD", 
      __value__: "99.99" 
     } 
         ], 
    convertedCurrentPrice: [ 
     { 
     @currencyId: "USD", 
     __value__: "99.99" 
     } 
          ], 
    sellingState: [ 
     "Active" 
        ], 
    timeLeft: [ 
     "P26DT23H9M53S" 
       ] 
     } 
       ], 
    listingInfo: [ 
     { 
     bestOfferEnabled: [ 
      "false" 
       ], 
     buyItNowAvailable: [ 
      "false" 
          ], 
     startTime: [ 
      "2014-10-17T00:43:32.000Z" 
        ], 
    endTime: [ 
     "2016-08-07T00:43:32.000Z" 
      ], 
    listingType: [ 
     "FixedPrice" 
       ], 
    gift: [ 
     "false" 
      ] 
     } 
      ], 
    returnsAccepted: [ 
     "true" 
        ], 
    condition: [ 
     { 
     conditionId: [ 
      "1000" 
        ], 
     conditionDisplayName: [ 
      "New" 
           ] 
     } 
       ], 
    isMultiVariationListing: [ 
     "false" 
          ], 
    discountPriceInfo: [ 
     { 
     originalRetailPrice: [ 
     { 
     @currencyId: "USD", 
      __value__: "209.99" 
     } 
          ], 
     pricingTreatment: [ 
      "STP" 
          ], 
     soldOnEbay: [ 
      "false" 
        ], 
     soldOffEbay: [ 
      "false" 
        ] 
     } 
        ], 
    topRatedListing: [ 
     "true" 
        ] 
     }, 

:椅子の検索

、 始まるコードは次のようになります。 ["item"] [1]を上記のJSONと同じ属性で置き換えます。

コードがいくつかありますが、すべてのネスティングはこの部分と似ています。 これまでのコードでは、モデルのbase_uriパラメータに表示されているような個別の項目が1つだけ表示されています& &ビューでは、各ページに25個の項目がページされます。& 25個の項目が表示されます。

私はこの情報に個別にアクセスすることを認識しており、商品ごとに["title"] などの情報にアクセスするには、["item"][0], ["item"][1],などのアイテム配列にアクセスする必要があります。

そして私は上記の方法でコードをテストしたこともあり、そうすると(product["searchResult"][0]["item"][0]["title"])製品ごとにテーブルにタイトル値を置くことができますが、フォーマットは正しく行われません。 - 私のビューファイルにコード化されたテーブル内のレンダリング値、すべての周りのアレイブロックと引用符で

["Black PU Leather High Back Office Chair Executive Task Ergonomic Computer Desk"] 

: 実際の値は、このように、アレイから現れます。

どのように配列/ハッシュから「真の」値を抽出するのですか? - 配列ブロックのコードと引用符を取り除く

また、モデルファイルのbase_uriコードに見られるように、リスティングは、get要求時にページあたり25個の製品の結果で自動的に改ページされます。この&事前に定義し、これを知っ

、どのように私は、反復処理と["searchResult"][0]["item"][1..25]title値& galleryURL値のすべての25の値にアクセスできますか? &もう一度。各値の周囲には[ ]""がなくなります。

コード私は25の["item"]配列値をサンプリングし、今使用していますが、基本的には私はこのすべてを把握しようとしてきた一方で、私はfindItemsKeywordsResponseJSONテーブルから以前の投稿正確なコードをレンダリングしています。

これについてのヘルプは非常に非常に高く評価されます。

また、上記の配列値を25 ["item"]でサンプリングしても、1つの行に25個のサンプルがすべてレンダリングされます。ハッシュロケット使用

:あなたの最初の質問に答えるために

+0

ようこそスタックオーバーフロー。 "[ask]"とリンク先ページ、 "[mcve]"をお読みください。あなたの質問は長いです。問題を説明するのに必要な最小限に抑えてください。それ以外のものは、あなたがそれを見渡し、あなたが書いたことを理解しようとするとき、あなたのための助けを遅らせる。また、「編集」や「更新」を使用せず、変更を最初に置いたようにテキストに組み込んでください。 –

+0

私は執筆が長いことを理解していますが、それは複数の部分の質問です。私は質問を整理した塊に分けました。 私はこれが基本的に理解するのに重要な概念だと思うし、あまりにも重すぎて応答が少ない場合、応答する人は本質的に役立つでしょう。 ありがとうございました! – Henny

+0

JSONをインデントして読みやすくするのはどうですか? –

答えて

0

JSONについてはdefault_params "SERVICE-NAME" => "FindingService", "OPERATION-NAME" => "#{operation}"

を、あなたは完全な応答を投稿できますか?それは終わりに終わったように見える。それは見えます、あなたは上記の投稿レスポンスがJSONではないことに注意し、また

items = { 
     item: [{ 
     itemId: [ 
      '351198621254', 
     ], 
    title: [ 
     'Black PU Leather High Back Office Chair Executive Task Ergonomic Computer Desk', 
    ], 
    }, 
    { 
    itemId: [ 
     '551198621254', 
    ], 
    title: [ 
     'Blue PU Leather High Back Office Chair Executive Task Ergonomic Computer Desk', 
    ] 
    } 
    ] 
} 

def parse_response_item_list(res) 
    items = [] 
    res[:item].each do |item| 
    parse_response_item(item) do |parsed| 
     items << parsed 
    end 
    end 
    items 
end 

def parse_response_item(res) 
    tidy_result = {} 
    if res.is_a? Hash 
    res.each_pair do |key,val| 
     if val.is_a? String 
     tidy_result[key] = val 
     else 
     parse_response_item(val) do |string| 
      tidy_result[key] = string 
     end 
     end 
    end 
    yield tidy_result 
    elsif res.is_a? Array 
    res.each do |e| 
     parse_response_item(e) { |r| yield r } 
    end 
    elsif res.is_a? String 
    yield res 
    end 
    tidy_result 
end 

result = parse_response_item_list(items) 
p result 
[ 
    { 
    :itemId=>"351198621254", 
    :title=>"Black PU Leather High Back Office Chair Executive Task Ergonomic Computer Desk" 
    }, 
    { 
    :itemId=>"551198621254", 
    :title=>"Blue PU Leather High Back Office Chair Executive Task Ergonomic Computer Desk" 
    } 
] 

は、ここでは一つであり、あなたがこれを行うことができ、複数の方法がありますなど、項目を反復処理についてのあなたの質問に答えるために、 ruby配列のデータダンプのようなものです。

+0

ありがとうございました!それは私を過ぎて右に滑った。 元の投稿を完全な応答で更新しました。 – Henny

+0

もし私があなただったら、レスポンスを解析してすべての関連ビットをハッシュに埋め込むコードのチャンクを書くでしょう。 'response.each_pair do | k、v |' ...ここから始めると、各値を調べて文字列か構造体の型かどうかを調べることができます#is_a?これを手助けするために、この解析ルーチンをいくつかの異なる方法に分けて再帰できるようにします。理にかなっている? – starbelly

+0

はい、あります。これは非常に役に立つ応答です&私はあなたの提案を始めます - しかし、私はいくつかについて混乱しています.. [item "]が数多くの配列であることを知って、私はそれらの内部にハッシュ値で改ページすることを許可しているので? &各値を調べる際に、結果が文字列の場合は、各値の周りの([""])をどのようにスライスしますか? – Henny

関連する問題