我正在玩Grape gem并尝试构建API,只是为了满足我的好奇心。现在我想实现允许使用单一路由获取所有对象列表或在请求体中指定的对象列表的功能。我也使用Mongoid作为数据映射器,所以我假设方法应如下所示:
params do
optional :color, type: String
optional :size, type: Integer
end
get :catalog do
if declared(params)
Product.where declared(params)
else
Product.all
end
end
但是它不起作用,无论数据请求体包含什么,响应总是返回集合中呈现的对象的完整列表。这是否意味着declared(params)
评估为false
?但是当我将字符串放到if
块时,它会将第一个字符串作为true
评估返回。
你能解释一下它的运作方式吗?我可以实现该单路径功能吗?
提前谢谢。
答案 0 :(得分:1)
默认情况下,方法不起作用Grape在nil
哈希中提供偶数declared(params)
值。因此,如果:color
提供但:size
不是,则哈希看起来像{declared_params: {color: 'green', size: nil}}
,这对于Mongoid是不可接受的。所有魔法都隐藏在include_missing
提供的declared
选项中。因此,将false
选项分配给Product.where declared(params, include_missing: false)
将会削减所有nil
值,而Mongoid会开始接受declared
哈希值。