У меня есть CorsController
, чья работа заключается в том, чтобы отвечать на заголовки заголовков crossdomain ajax (если позволяет Origin), когда мое приложение получает запрос OPTIONS
. Но поскольку я точно не знаю, где будет запрашиваться запрос OPTIONS
, у меня есть полный маршрут в верхней части файла маршрутов, чтобы поймать любой запрос OPTIONS
на любой путь.Поймать весь маршрут и 404 в рельсах 2.x
map.cors '*path',
:controller => 'cors',
:action => 'index',
:conditions => { :method => :options }
Для настоящих OPTIONS
запросов это отлично работает. Проблема возникает, когда приложение должно обслуживать 404 Not Found
.
Теперь, когда я загружаю /no/404/for/you
(путь, которым мое приложение не обрабатывает маршрут), я больше не получаю 404. Вместо этого этот маршрут активируется, и я получаю 405 Method Not Allowed
. Это приводит к тому, что наши журналы заполняются ошибками, которые на самом деле не являются ошибками, и мониторинг (например, New Relic) для отправки панических сообщений об ошибках, когда на самом деле все в порядке.
Похоже, что путь соответствует, но :conditions
не делает и вызывает исключение. Интересно, что, по-видимому, обработка маршрута - это процесс с 2-мя проходами. Этот маршрут cors в верхней части файла маршрутов запускается только при наличии запроса OPTIONS
(хороший) или если никакой другой маршрут не объявляется после его совпадения, и нет статического файла на этом пути (плохо).
Вопрос:
Как я могу получить этот улов-весь маршрут, чтобы ударить мой контроллер для всех OPTIONS
запросов, без нее также перехватывать и бросала ошибки с иным несогласованными маршрутами через GET
, POST
, PUT
и DELETE
?
И я должен сделать это, к сожалению, в Rails 2.x.
'если никакой другой маршрут не объявляется после его совпадения' Почему бы не добавить маршрут, который соответствует * все * еще в конце и вернуть 404? – oldergod
@oldergod Ну ... Не могу поверить, что я об этом не думал. Хотя это кажется немного взломанным. Но да, это работает. Отправьте это как ответ, и вы можете получить щедрость! –