2010-02-11 3 views
4

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

Le code fonctionne très bien sur Safari et sur Google Chrome (mac), mais quand je l'ai essayé sur Firefox (3.5.7), j'ai eu une erreur bizarre '406 Non Acceptable'.

Lorsque je regarde les en-têtes, Firefox indique qu'il n'accepte que les réponses 'texte/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 des rails pour 'text/javascript'

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

Le type de contenu est en effet changé dans Chrome, mais pas dans Firefox où il reste 'text/html'.

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

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

Y at-il quelque chose que je peux faire pour que cela fonctionne dans Firefox? Merci

Répondre

4

Ajouter une extension .json à votre URL dans l'appel post

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

Ou (peut-être mieux) ajouter ce qui suit à vos application.js pour définir les en-têtes pour toutes les demandes ajax

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

Merci Paul. jQuery.ajaxSetup n'a fourni aucune aide, mais j'ai suivi votre première réponse. J'ai créé une route spécifique dans les rails dédiés à l'appel ajax ajaxlocator.json et ça marche maintenant très bien! Merci. – jlfenaux

+0

La première solution a fonctionné pour moi aussi, merci Paul! –

0

Il n'est pas logique que différents navigateurs voient des en-têtes HTTP différents. C'est peut-être un problème de mise en cache.

+0

@Kgiannakakis s'il vous plaît me suggérer une solution pour http://stackoverflow.com/questions/2242418/inheriting-baseclass-to-an-ajax-enabled-wcf-service-class et http://stackoverflow.com/questions/2242788/ajax-enabled-wcf-service-ne-semble-pas-travailler-pour-moi –

4

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

Cela fonctionne:

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

Credit goes to this blog.

Meilleures salutations. Asbjørn Morell

+0

C'est une bien meilleure réponse pour moi; définir une option globale qui prend simplement soin de Firefox! J'ai jQuery.ajaxSetup de Paul Groves déjà dans ma demande.js, mais celui-ci amendé le fait. À votre santé! –

-1

Aucune des suggestions ci-dessus (atmorell, Groves Paul) m'a fixé pour ... je trouve jquery $.ajax not working in firefox against rails (406 response) (works in chrome & IE)

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

Pour l'enregistrement, je ne fais pas un appel .ajax direct; J'utilise plutôt JQuery.L'autocomplétion de l'interface utilisateur:

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

et 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 

a la Railscast # 102.

Questions connexes