2016-12-19 8 views
0

私は単純なアイテムモデルと "/ items"と "/items.json"を持っています。しかし、私はAPI呼び出しで "/items.json?skuid=123"のような検索パラメータを追加したいので、返されたjsonはskuid = 123の項目しか持たない。Railsアプリ - API取得リクエストでクエリパラメータを追加する方法は?

してくださいアドバイスを

class ItemsController < ApplicationController 
    before_action :set_item, only: [:show, :edit, :update, :destroy] 

    # GET /items 
    # GET /items.json 
    def index 
    Rails.logger.debug("index.params=#{params}") 
    @items = Item.all(params.slice(*Item.attribute_names)) 
    end 

しかし、エラーが発生しました引数の

間違った番号(1を与えられたが、0を予想):

は、私は、次の方法を試してみました。

+1

私はあなたが最初に 'skuid'をチェックしなければならないと思っていますparamsはprasentですか、そうではありません' where''このように 'where' caluse' item.where( "skuid =?"、params [:skuid]) ' – uzaif

+0

ありがとう。部分的な成功。 "/items.json?skuid=123"はあなたの提案に感謝します。 skuidが "123"だったアイテムが返されましたが、 "/items.json"が空のjsonを返すようになりました。以前はデータベースからすべての項目を返すことがありました。アドバイスできますか? – Pushkar

+0

検索項目を処理するブロックを使用すると完了しました – uzaif

答えて

2

あなたのコードをスコープにリファクタリングします。あなたのItemコントローラで次に

class Item < ActiveRecord::Base 
    scope :by_sku_id, -> (sku_id) { where(sku_id: sku_id) if sku_id.present? } 
end 

:あなたのItemモデルで

これはあなたのパラメータは、あなたのコントローラ内に設定されているかどうか心配の問題を軽減

def index 
    @items = Item.by_sku_id(params[:sku_id]) 
end 

。全体的にコントローラコードが簡素化されます。これらのスコープを連鎖させてAPIを柔軟に保つこともできます。

+0

これは機能します!私はあなたがそこで何をしたのかを理解するためにスコープを読まなければなりませんでした。エレガントです。ありがとう! – Pushkar

関連する問題