在我的 Rails 应用程序中:
地点有很多啤酒
啤酒属于_to location
当 iOS 应用程序调用
locations/%@/beers.json
时,我希望啤酒控制器仅响应从我的 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
但是即使我得到状态 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 的啤酒?
首先,如果您正在寻找 RESTful 服务,那么您正在寻找的操作是
show
,而不是 index
。
要修复您提到的错误,您需要将查询更改为:
@beers = Beer.where(:location_id => params[:location_id])
假设
location_id
是您正在寻找的字段。
我会仔细查看你的路线,它定义了你的网址。 他们不遵循正常惯例。
/locations/...
将属于 Location
资源。
/beers/...
将属于 Beer
资源。
你当前的路线破坏了惯例(这对你不利)。