Merb Router: как вернуть ошибку 406 - PullRequest
0 голосов
/ 27 августа 2009

Возможно ли, чтобы маршрутизатор возвращал код ошибки (или весь ответ стойки) в ответ на согласованный маршрут?

например. Я перешел от WordPress к домашнему решению для ведения блогов. Поисковые системы обращаются к URL-адресам типа '/?tag=ruby', которые должны возвращать ошибку 406. Вместо этого маршрутизатор покорно направляет их в то же место, что и /. Я могу сопоставить URL-адреса, от которых я хочу избавиться, но я не знаю, что с ними делать

1 Ответ

0 голосов
/ 27 августа 2009

Это не очевидно, но это эффективно.

Решение:

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']]

...