0

私のレールアプリで

ロケーション have_many ビール

ビールの所属場所

iOS アプリが呼び出したときに、iOS アプリlocations/%@/beers.jsonから呼び出されている location_id にのみ属するビールで Beers Controller が応答するようにします。

ユーザーが場所 1 をタップしたときにクライアントから送信される要求を次に示します。

Started GET "/locations/1/beers.json" for 127.0.0.1 at 2013-03-09 11:26:16 -0700
Processing by BeersController#index as JSON
  Parameters: {"location_id"=>"1"}
  Beer Load (0.1ms)  SELECT "beers".* FROM "beers" 
Completed 200 OK in 12ms (Views: 1.8ms | ActiveRecord: 0.4ms)

これが私のビールコントローラーコードです

class BeersController < ApplicationController

  def index
    @beers = Beer.all
    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @beers }
    end
  end

現在、これは location_id に関係なく、すべてのビールのリストをクライアントに返します。

これまで私は試しました

class BeersController < ApplicationController

  def index
    @beers = Beer.find(params[:location_id])
    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @beers }
    end
  end

しかし、ステータス200を取得しても、iOSアプリがクラッシュします

 Started GET "/locations/1/beers.json" for 127.0.0.1 at 2013-03-09 11:19:35 -0700
    Processing by BeersController#index as JSON
      Parameters: {"location_id"=>"1"}
      Beer Load (0.1ms)  SELECT "beers".* FROM "beers" WHERE "beers"."id" = ? LIMIT 1  [["id", "1"]]
    Completed 200 OK in 2ms (Views: 0.6ms | ActiveRecord: 0.1ms)

上記のリクエストでは、そうすべきではありません

Beer Load (0.1ms) SELECT "beers".* FROM "beers" WHERE "beers"."location_id" = ? LIMIT 1 [["location_id", "1"]]

クライアントから送信された location_id にのみ属するビールで応答するようにコントローラーを変更するにはどうすればよいですか?

4

1 に答える 1

2

まず第一に、探しているアクションはであり、RESTful サービスを探している場合ではshowありません。index

言及したエラーを修正するには、クエリを次のように変更する必要があります。

@beers = Beer.where(:location_id => params[:location_id])

location_idあなたが探しているフィールドであると仮定します。

URLを定義するルートをよく調べます。彼らは通常の慣習に従っていません。

/locations/...リソースに属しLocationます。

/beers/...リソースに属しBeerます。

あなたは現在のルートで(あなたに不利に働く)慣習をいじっています。

于 2013-03-09T18:46:47.677 に答える