0

在我的 Rails 应用程序中

地点有_很多啤酒

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

4

1 回答 1

2

首先,您要查找的操作是show,而不是index您要查找 RESTful 服务。

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

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

假设location_id是您正在寻找的领域。

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

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

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

你正在用你当前的路线搞乱惯例(这对你不利)。

于 2013-03-09T18:46:47.677 回答