406 Недопустимая ошибка при использовании Jquery $ .post в Firefox, но не в Safari или Chrome - PullRequest
4 голосов
/ 11 февраля 2010

Я использую команду Jquery (1.3.2) $ .post для вызова ajax-вызова на сервер rails.

Код прекрасно работает в Safari и в Google Chrome (mac), но когда я попробовал его в Firefox (3.5.7), я получил странную ошибку «406 Not Acceptable».

Когда я смотрел на заголовки, Firefox указал, что он принимает только ответы 'text / javascript'. И ответ Content-Type был 'text / html; кодировка = UTF-8' .

В Chrome приняты следующие типы: «application / json, text / javascript, / , text / javascript», а тип содержимого ответа «application / json»; кодировка = UTF-8' .

Я попытался заставить тип содержимого в rails 'text / javascript'

format.json do
   render :json => @races.to_json, :content_type => 'text/javascript'
end

Тип содержимого действительно изменен в Chrome, но не в Firefox, где он остается «text / html».

Вот код, который я использовал для запуска вызова ajax.

$.post(
    "/locator",
    params, 
    function(data){...},
    "json"
);

Есть ли что-то, что я могу сделать, чтобы эта работа работала в Firefox? Спасибо

Ответы [ 5 ]

4 голосов
/ 11 апреля 2010

Была такая же проблема.Кажется, это проблема Firefox.

Это работает:

jQuery.ajaxSetup({ 'beforeSend': function(xhr) {xhr.setRequestHeader("Accept", "text/javascript,application/javascript,text/html")} })

Кредит идет в этот блог.

С уважениемАсбьерн Морелл

4 голосов
/ 11 февраля 2010

Добавьте расширение .json к вашему URL в пост-звонке

$.post(
"/locator.json"
...

Или (возможно, лучше) добавить следующее в ваш application.js, чтобы установить заголовки для всех запросов ajax

jQuery.ajaxSetup({ 
  'beforeSend': function(xhr) {xhr.setRequestHeader("Accept", "text/javascript")} 
})
0 голосов
/ 05 апреля 2011

Ни одно из приведенных выше предложений (atmorell, Paul Groves) не исправило это для меня ... тогда я обнаружил, что jquery $ .ajax не работает в firefox против рельсов (ответ 406) (работает в chrome & IE)

Как я там прокомментировал, принятый ответ сработал! (используя format.js вместо format.json и "render: text => item.to_json")

Для справки, я не делаю прямой вызов .ajax; скорее я использую автозаполнение JQuery.UI:

$(document).ready(function() {
    $("input#task_summary_task_wbs").autocomplete({
        source: "/tasks/summary.js"
    });
});

и это в моем TasksController:

# GET /tasks/summary.js
def summary
  @tasks = Task.find(:all,
                     :conditions => ['is_summary = true AND wbs like ?',
                                     "%#{params[:term]}%"],
                     :order => :wbs)
  respond_to do |format|
    format.js {
      render :text => @tasks.collect {|t| t.wbs_name}.to_json
    }
  end
end

a la Railscast # 102.

0 голосов
/ 11 февраля 2010

Я использую опцию contentType во время вызова $ .ajaxSetup для явной установки типа контента.Эта работа во всех браузерах: http://api.jquery.com/jQuery.ajax/

0 голосов
/ 11 февраля 2010

Не имеет смысла, что разные браузеры видят разные заголовки HTTP. Возможно, это проблема кеширования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...