2013-02-18 15 views
0

У меня есть 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.

+0

'если никакой другой маршрут не объявляется после его совпадения' Почему бы не добавить маршрут, который соответствует * все * еще в конце и вернуть 404? – oldergod

+0

@oldergod Ну ... Не могу поверить, что я об этом не думал. Хотя это кажется немного взломанным. Но да, это работает. Отправьте это как ответ, и вы можете получить щедрость! –

ответ

2

Так вы говорите

Этот Корс маршрут, в верхней части моего файла маршрутов, срабатывает только если есть OPTIONS запрос (хорошо) или если никакой другой маршрут не объявлять после того, как он соответствует и там не является статическим файлом на этом пути (плохой).

Вы можете добавить маршрут в самом конце вашего routes.rb, что бы соответствовать все остальное и просто вернуть 404.

Как ваш сказал, что это своего рода Hacky, но я не вижу никакого другого пути к завершите свой маршрутом общего доступа наверху. Может, кто-то придумает что-то еще.

+0

Это сработало. Он запускает действие контроллера однострочным «render: file =>» # {RAILS_ROOT} /public/404.html »,: status =>: not_found', что, похоже, делает обычную вещь, не вызывая уродства NewRelic. Спасибо за идею! –

Смежные вопросы