Веб-служба Rails с Grape, возвращающая неопределенную ошибку

Я пытаюсь создать веб-службу API в Rails с помощью Grape. Я следовал этому руководству.

Мне удалось все настроить и запустить, и я ожидал, что все будет работать идеально. Однако, когда я пытаюсь проверить свою конечную точку API, мне выдается неопределенная ошибка. Я не уверен, с чего начать, так как не знаю, как интерпретировать возвращенную ошибку. Вот:

compared with non class/module

def rescuable?(klass)
  options[:rescue_all] || (options[:rescue_handlers] || []).any? { |error, _handler| klass <= error } || (options[:base_only_rescue_handlers] || []).include?(klass)
end

Вот 20 последних записей в моей трассировке:

grape (0.13.0) lib/grape/middleware/error.rb:50:in `<='
grape (0.13.0) lib/grape/middleware/error.rb:50:in `block in rescuable?'
grape (0.13.0) lib/grape/middleware/error.rb:50:in `any?'
grape (0.13.0) lib/grape/middleware/error.rb:50:in `rescuable?'
grape (0.13.0) lib/grape/middleware/error.rb:30:in `rescue in call!'
grape (0.13.0) lib/grape/middleware/error.rb:25:in `call!'
grape (0.13.0) lib/grape/middleware/base.rb:18:in `call'
rack (1.6.4) lib/rack/head.rb:13:in `call'
rack (1.6.4) lib/rack/builder.rb:153:in `call'
grape (0.13.0) lib/grape/endpoint.rb:202:in `call!'
grape (0.13.0) lib/grape/endpoint.rb:190:in `call'
rack-mount (0.8.3) lib/rack/mount/route_set.rb:152:in `block in call'
rack-mount (0.8.3) lib/rack/mount/code_generation.rb:96:in `block in recognize'
rack-mount (0.8.3) lib/rack/mount/code_generation.rb:68:in `optimized_each'
rack-mount (0.8.3) lib/rack/mount/code_generation.rb:95:in `recognize'
rack-mount (0.8.3) lib/rack/mount/route_set.rb:141:in `call'
grape (0.13.0) lib/grape/api.rb:114:in `call'
grape (0.13.0) lib/grape/api.rb:44:in `call!'
grape (0.13.0) lib/grape/api.rb:39:in `call'
actionpack (4.2.2) lib/action_dispatch/routing/mapper.rb:51:in `serve'

Кто-нибудь может помочь мне понять, что здесь происходит?


person HermannHH    schedule 24.08.2015    source источник


Ответы (1)


В выражении klass <= error error не является классом или модулем, поэтому сравнение не выполняется. Вместо этого вы хотите проверить, является ли error.kind_of? klass (или, возможно, error.instance_of? klass, если вы хотите убедиться, что error является экземпляром именно этого класса. См. https://stackoverflow.com/a/3893305/1106267, чтобы узнать больше об этом различии.

РЕДАКТИРОВАТЬ:

Если вы дословно следовали связанному руководству, возможно, вы используете устаревшие методы в винограде. Согласно документам по обновлению, error_response (используется в руководстве для создания пользовательского ответа на ошибки ActiveRecord::RecordNotFound и ActiveRecord::RecordInvalid) следует заменить на error!, если вы используете виноград >= 0,12.

person Charles Treatman    schedule 24.08.2015
comment
Спасибо @Чарльз. Может ли это быть проблемой с Grape, поскольку этот фрагмент является частью драгоценного камня Grape. Это не я добавил? - person HermannHH; 24.08.2015
comment
это очень помогло. После исправления мне просто нужно было изменить ссылки на модели с «Graduate.all» на «:: Graduate.all», и теперь все работает отлично. - person HermannHH; 25.08.2015