iOS通过参数获取对Rails API的请求

时间:2013-03-09 18:39:01

标签: ios ruby-on-rails api parameters afnetworking

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

1 个答案:

答案 0 :(得分:2)

首先,如果您正在寻找RESTful服务,那么您要查找的操作是show,而不是index

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

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

假设location_id是您正在寻找的字段。

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

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

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

您正在使用当前路线搞乱惯例(对您不利)。