在我的Rails应用中

地点有很多啤酒

啤酒归属

当iOS应用程序调用locations/%@/beers.json时,我希望Beers Controller用仅属于从我的iOS应用程序调用的location_id的啤酒进行响应。

这是用户点击位置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


但这会导致iOS应用崩溃,即使我的状态为200

 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的啤酒响应?

最佳答案

首先,要查找的操作是show,而不是index(如果要查找RESTful服务)。

要解决您提到的错误,您需要将查询更改为:

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


假设location_id是您要查找的字段。

我会仔细检查您的路由,这些路由定义了您的网址。他们不遵循常规惯例。

/locations/...将属于Location资源。

/beers/...将属于Beer资源。

您现在的路线搞乱了约定(对您不利)。

07-24 09:35