我正在寻找有关在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
答案 0 :(得分:2)
您可以使用resource
和route
方法。
参数处理存在问题 - params[:id]
默认为String
。您运行的示例硬编码值是Fixnum
(整数)。
可能在ITEMS上查询列表的(未显示)代码正在查找整数值。
您可以使用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