2014-12-29 2 views
0

Я играю с виноградным самоцветом и пытаюсь построить API, просто чтобы накормить свое любопытство. Теперь я хочу реализовать функцию, которая позволяет использовать один маршрут для получения списка всех объектов или списка объектов, указанных в теле запроса. Кроме того, я использую Mongoid в качестве картографа данных поэтому я предполагаю, метод должен выглядеть следующим образом: Проверить наличие params в Grape

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

Вы пытаетесь выполнить запрос '' где TRUE', который, очевидно, возвращает все. Вероятно, вы хотите построить запрос типа (в псевдокоде) 'Product.where: color = declare (params) [: color] ...'. – mudasobwa

+0

Откажитесь от того, что действительно 'объявлено (params)' return, оно должно работать * почти *, как вы ожидаете, если я правильно помню. –

ответ

1

Метод не работает по умолчанию. Урожай обеспечивает равномерные значения 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 хэш.