0

以下のルートがあります。

  namespace :api do
    namespace :v1 do 
      resources :places, only: [:index]
    end
  end

コントローラーのコード:

class API::V1::PlacesController < API::V1::ApplicationController

  def index
    @places = (!params[:id]) ? Place.all : Place.find_all_by_type_id(params[:id])
    respond_to do |format|
      format.json { render json: @places }
      format.html
    end
  end   

end

「Place」には「type_id」フィールドがあり、filter_id で場所をフィルタリングしたい。ご覧のとおり、「places?id=1」として URL 経由でパラメーターを送信します。しかし、パラメータを「places/1」として送信する必要があるのでしょうか? パスも設定する必要があります。現在、"?id=1" フォームでは機能しません。教えてください、どうすればいいですか?ありがとう。

4

2 に答える 2

1

Rails の規則では、"index" アクションで場所のリストを相対パス/places(GET メソッド) にマップします。

そして、/places/1(GET) は、コレクションのメンバーを表示するための「show」にマップされます。「show」の場合、ルートはパスの ID セグメント (「1」) を に割り当てますparams[:id]

ガイドには、デフォルト ルート マッピングの表があります。:type_idモデルの属性:idとルートの属性は、おそらくあなたを混乱させました。

簡単な解決策は、/places?type_id=1代わりに使用することです。コントローラーでは、次のようなものを使用できます。

def index
  collection = Place.all
  collection = collection.where(:type_id => params[:type_id].to_s) unless params[:type_id].to_s.blank?
  respond_to do |format|
    # ...
  end
end

相対パスに統合するのではなく、クエリ パラメーターとして設定:type_idすることは、API を構築していて、将来さらに多くのフィルターのサポートを追加する可能性があるため、私には特に合理的です。

于 2013-10-01T17:23:22.353 に答える