eng рус  
small_logo

Разработка приложений с помощью Ruby on Rails™


respond_to в IE

Ни для кого не секрет, что 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"

Первый способ явно лучше.

Оставьте свой комментарий

(не будет опубликовано)

О нас Проекты Блог Контакты
© 2008, команда hashtrain.com