在Grape中声明资源路径的语法

时间:2014-02-10 21:13:56

标签: ruby grape

我正在寻找有关在Grape中声明API资源路径的语法的说明。下面的示例声明资源路径“/ items”,“/ items /:id”,“/ objects”和“/ objects /:id”。我不明白的是为什么“/ items /:id”的定义返回null?

class API < Grape::API

  format :json
  default_format :json

  rescue_from :all, backtrace: true


  resource :items do

    desc "Returns an array of all items."
    get do
      ITEMS.find.to_a
    end

    desc "Returns an item by its id."
    get '/:id' do

      # hardcoding the document id returns the correct document
      # ITEMS.find_one( "item_id" => 2519 )

      # using the path parameter :id returns null, why???
      ITEMS.find_one( "item_id" => params[:id] )
    end
  end


  resource :objects do

    desc "Returns an array of all objects."
    get do
      OBJECTS.find.to_a
    end

    ##
    # using the route_param syntax correctly returns the document
    # resource path /objects/:id
    ##
    desc "Returns an object by its id."
    params do
      requires :id, type: Integer
    end
    route_param :id do
      get do
        OBJECTS.find_one( "object_id" => params[:id] )
      end
    end
  end

end

1 个答案:

答案 0 :(得分:2)

您可以使用resourceroute方法。

参数处理存在问题 - params[:id]默认为String。您运行的示例硬编码值是Fixnum(整数)。

可能在IT​​EMS上查询列表的(未显示)代码正在查找整数值。

您可以使用ITEMS.find_one( "item_id" => params[:id].to_i )转换内联参数。

但是,你可能应该使用params描述块让Grape为你转换,就像你已经用于OBJECTS一样:

desc "Returns an item by its id."
params do
  requires :id, type: Integer
end
get '/:id' do
  ITEMS.find_one( "item_id" => params[:id] )
end