在我的rails应用
中地点has_many啤酒
啤酒属于地点
当iOS应用程序调用{{1}}时,我希望Beers Controller响应仅属于从我的iOS应用程序调用的location_id的啤酒。
以下是用户点击位置1时从客户端发送的请求。
locations/%@/beers.json
这是我的啤酒控制器代码
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)
现在,无论其location_id如何,都会向客户返回所有啤酒的列表。
到目前为止,我已经尝试了
class BeersController < ApplicationController
def index
@beers = Beer.all
respond_to do |format|
format.html # index.html.erb
format.json { render json: @beers }
end
end
但即使我获得状态200
,也会崩溃iOS应用程序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
在上述请求中不应该是
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)
]
如何更改控制器以使其响应仅属于客户端发送的location_id的啤酒?
答案 0 :(得分:2)
首先,如果您正在寻找RESTful服务,那么您要查找的操作是show
,而不是index
。
要解决您提到的错误,您需要将查询更改为:
@beers = Beer.where(:location_id => params[:location_id])
假设location_id
是您正在寻找的字段。
我会仔细查看您的路线,这些路线定义了您的网址。他们不遵循正常的惯例。
/locations/...
属于Location
资源。
/beers/...
属于Beer
资源。
您正在使用当前路线搞乱惯例(对您不利)。