Как выбрать формат ответа в зависимости от того, какой хочет браузер?
Есть страница localhost:3000/err404, на которой отображается соответствующая незатейливая информация. На эту страницу пользователь должен попасть, если пользователь ввел некорректный адрес на моем сайте. Но это происходит и когда мой js скрипт обращается к роуту, который я по неосторожности удалил. И получается, что я жду к примеру JSON, а сервер выплевывает html. И ошибки 404 я не вижу. Могу увидеть только ошибку парсинга JSON. Как в экшене err404 решить рендерить шаблон 404.html.erb или послать стандартный для моего проекта json {:status=> "error", :message=> "404"}? Ну или другими словами, как узнать, в каком виде браузер ожидает ответ?
curl local:3000 -Iv
* About to connect() to local port 3000 (#0)
* Trying 127.0.0.1... connected
> HEAD / HTTP/1.1
> User-Agent: curl/7.22.0 (i686-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
> Host: l:3000
> Accept: */*
В заголовке "Accept" браузер передает MIME типы, того что он хочет принять. Правда еще может передаваться формат и в url. Рельса на этой основе выбирает как ей ответить. Там все просто, никаких сложных алгоритмов. Но не помню точно как.
В respond_to сверху вниз пробегает доступные форматы пытаясь отдать нужный, либо по соглашению выбирает файл.
Можете сделать тестовый экшн и поэкспериментировать. Заголовки и форматы будут доступны в дебагере.