Ни для кого не секрет, что IE самый удивительный браузер. В нем многое реализовано в обход стандартов, по-своему. Из-за чего часто возникают неприятные ситуации для разработчиков.
Используя метод respond_to при разработке нашего приложения, мы должны передавать код блока в определенном порядке. Например, мы можем написать так:
def show
respond_to |format| do
format.js {render :partial => ’show’}
format.html {}
end
end
В FF все отработает правильно, то есть при обычном запросе мы возвратим обработанный шаблон «show.html.erb», а при AJAX запросе «_show.html.erb».
Но при использовании IE 6 нас ждет неприятный сюрприз – при любом запросе respond_to будет возвращать «_show.html.erb». То есть будет срабатывать первая проверка на формат «format.js»
Проблема заключается в том, что IE по умолчанию посылает неправильный “Accept” заголовок серверу нашего приложения. Метод respond_to проверяет “Accept” заголовок с различными форматами и выполняет нужный код.
FireFox по умолчанию посылает “Accept” заголовок, содержаший “text, html, xml” комбинации. Но IE делает все по-своему и посылает по умолчанию “Accept” заголовок, который не содержит перечисление следующих форматов “text, html, xml”.
Поэтому когда запрос приходит от IE, respond_to не находит вхождений форматов в “Accept” заголовке и по умолчанию выполняет действия для первой проверки (То есть той что написана выше) - format.js.
При AJAX запросе, библиотека prototype сама проставит “Accept” заголовок “text/javascript”. В этом случае respond_to может точно определить что верный формат format.js.
1) Всегда писать выше сравнение на формат, который должен быть по умолчанию. Например так:
def show
respond_to |format| do
format.html {}
format.js {render :partial => ’show’}
end
end
2) Написать before_filter "set_proper_accept_header' в контроллере. И устанавливать нужный вам заголовок, если браузер пользователя IE.
request.env["HTTP_ACCEPT"] = "application/xml"
Первый способ явно лучше.
Оставьте свой комментарий