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 过滤位置。如您所见,现在我通过 URL 将参数作为“places?id=1”发送。但可能我必须将参数发送为“places/1”吗?我还需要设置路径;现在它们不适用于“?id = 1”形式。请告诉我,我该怎么做?谢谢。

4

2 回答 2

1

Rails 约定是将“索引”操作中的位置列表映射到相对路径/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 回答
0

我的建议是像这样重写它:

# Your routes
namespace :api do
  namespace :v1 do 
    resources :places, only: [:index]
    get "/places/by_type/:type_id" => "places#by_type", as: :places_by_type
  end
end

# Your controller

class API::V1::PlacesController < API::V1::ApplicationController
  def index
    respond_to do |format|
      format.json { render json: @places }
      format.html
    end
  end

  def by_type
    @places = Place.where(type_id: params[:type_id])
    respond_to do |format|
      format.js { render json: @places }
      format.html do
        render action: "index"
      end
    end
  end
end

我对路线可能有点错误,但我很确定它应该可以工作。

于 2013-10-01T17:19:29.923 回答