检查葡萄中的params存在

时间:2014-12-29 13:25:12

标签: ruby rest mongoid grape

我正在玩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评估返回。

你能解释一下它的运作方式吗?我可以实现该单路径功能吗?

提前谢谢。

1 个答案:

答案 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哈希值。