Erreur 406 non acceptable lors de l’utilisation de Jquery $ .post dans Firefox mais pas dans Safari ou Chrome

J’utilise la commande $ .post de Jquery (1.3.2) pour déclencher un appel ajax vers un serveur rails.

Le code fonctionne très bien sur Safari et sur Google Chrome (mac), mais lorsque je l’ai essayé sur Firefox (3.5.7), j’ai eu une étrange erreur «406 non acceptable».

Quand je regarde les en-têtes, Firefox a indiqué qu’il acceptait uniquement les réponses «text / javascript». Et la réponse Content-Type était ‘text / html; jeu de caractères = utf-8 ‘.

Dans Chrome, les types acceptés étaient ‘application / json, text / javascript, / , text / javascript’ et la réponse Content-Type était ‘application / json; jeu de caractères = utf-8 ‘.

J’ai essayé de forcer le type de contenu dans les rails à ‘text / javascript’

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

Le type de contenu est en effet modifié dans Chrome, mais pas dans Firefox où il rest “text / html”.

Voici le code que j’ai utilisé pour déclencher l’appel ajax.

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

Est-ce que je peux faire quelque chose pour que cela fonctionne dans Firefox? Merci

Ajouter une extension .json à votre URL lors de l’appel ultérieur

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

Ou (éventuellement mieux) ajoutez ce qui suit à votre application.js pour définir les en-têtes de toutes les demandes ajax

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

Avait le même problème. Cela semble être un problème de firefox.

Cela marche:

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

Le crédit va à ce blog.

Meilleures salutations. Asbjørn Morell

Cela n’a pas de sens que différents navigateurs voient différents en-têtes HTTP. C’est peut-être un problème de cache.

J’utilise l’option contentType lors de l’appel $ .ajaxSetup pour définir explicitement le type de contenu. Ce travail est disponible sur plusieurs navigateurs: http://api.jquery.com/jQuery.ajax/

Aucune des suggestions ci-dessus (atmorell, Paul Groves) ne l’a corrigé pour moi … alors j’ai trouvé que jquery $ .ajax ne fonctionnait pas dans firefox contre rails (réponse 406) (fonctionne en chrome et IE)

Comme je l’ai commenté, la réponse acceptée a fonctionné! (en utilisant format.js plutôt que format.json et “render: text => item.to_json”)

Pour mémoire, je ne fais pas un appel .ajax direct; J’utilise plutôt l’auto-compléteur de JQuery.UI:

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

et ceci dans mon 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 

à la Railscast # 102.