9

Je suis récemment passé à la fermeture de Google pour un nouveau projet. J'ai du mal à ajouter le jeton d'authenticité aux en-têtes dans un appel ajax. Comment je m'en occupe?Comment ajouter le jeton d'authenticité?

Mon bout Ajax (en utilisant la classe goog.net.XhrIo):

var initialHTMLContent = superField[i].getCleanContents(); 

var data = goog.Uri.QueryData.createFromMap(new goog.structs.Map({ 
    body: initialHTMLContent 
})); 

goog.net.XhrIo.send('/blogs/create', function(e) { 
    var xhr = /** @type {goog.net.XhrIo} */ (e.target); 
    alert(xhr.getResponseXml()); 
}, 'POST', data.toString(), { 
    'Accept' : 'text/xml' 
      }); 

utilisant des rails dans le back-end.

MISE À JOUR:

Log:

Processing BlogsController#create (for 127.0.0.1 at 2010-06-29 20:18:46) [PUT] 
    Parameters: {"authenticity_token"=>""} 

ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken): 


Rendered rescues/_trace (272.4ms) 
Rendered rescues/_request_and_response (1.2ms) 
Rendering rescues/layout (unprocessable_entity) 

Répondre

15

Quelque part dans un, vous pouvez définir une variable js comme vue rails (fichier .html.erb) ceci:

window._token = '<%= form_authenticity_token %>'; 

Et puis l'ajouter à votre appel:

goog.net.XhrIo.send('/blogs/create?authenticity_token=' + window._token, function(e) { 
    var xhr = /** @type {goog.net.XhrIo} */ (e.target); 
    alert(xhr.getResponseXml()); 
}, 'POST', data.toString(), { 
    'Accept' : 'text/xml' 
      }); 
+0

je reçois un '# '. Peut-être ne prend-il pas en compte le jeton d'authentification? J'ai mis à jour ma question avec le journal. –

+0

J'ai mis à jour la réponse en conséquence. Semble que vous avez cet appel dans un fichier javascript simple. Vous devez générer le jeton sur le serveur, vous devez donc le faire dans une vue. –

+0

J'ai mis à jour ma question. Ce n'est pas prendre en compte le jeton d'authentification quoi que ce soit. –

2

Rails maintenant ajoute automatiquement une balise meta pour elle, donc alors dans votre page javascript vous pouvez utiliser:

token = $('meta[name="csrf-token"]').attr('content') 
Questions connexes