Это не очевидно, но это эффективно.
Решение:
match('/',:query_string=>/.+/).defer_to do |request, params|
raise Merb::ControllerExceptions::NotAcceptable,
"Query String Unknown: #{request.query_string}"
end
Пояснение:
Чтобы вызвать ошибку 406, нам нужно поднять Merb::ControllerExceptions::NotAcceptable
, но если мы сделаем это при настройке маршрутов, это никому не поможет. Вместо этого нам нужно подождать, пока Merb не обработает запрос. это то, что делает блок defer_to
. Когда приходит запрос, мы поднимаем ошибку, и она перехватывается и обрабатывается так же, как если бы мы прошли через эту ошибку от контроллера.
Проблемы
Одна из целей моего первоначального вопроса состояла в том, чтобы избежать необходимости проходить через все накладные расходы. Вместо этого это решение отправляется через контроллер исключений, который в вычислительном отношении обходится дороже, чем [406,{'content-type'=>'text/plain},['406 Not Acceptable']]