在我的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
资源。您现在的路线搞乱了约定(对您不利)。