2009-04-08 12 views
13

que tienen algo de JavaScript hacer una llamada AJAX en mi sitio de rieles:protect_from_forgery y discreto Javascript

$.ajax({type: "PUT", url: url, data: { dummy: data }, complete: function(data) {}}); 

Cuando Rieles lo consigue, se lanza de nuevo un error ActionController::InvalidAuthenticityToken. Me gustaría mantener las cosas de protect_from_forgery ahí, si es posible ... Pero no sé cómo puedo pasar el token de autenticación de un archivo de JavaScript.

¿Alguien puede ayudarme?

Respuesta

21

En su diseño, añadir esto antes de cualquier otra JS funciona:

<script> 
    function authToken() { 
    return '<%= form_authenticity_token if protect_against_forgery? -%>'; 
    } 
</script> 

authToken se codifica como una función de modo que es menos probable es que accidentalmente sobrescribe con otra JavaScript.

Alternativamente, a partir de los carriles 3, el token de autenticación está incrustado como una etiqueta <meta>, que se puede leer con:

<script> 
    function authToken() { 
    return $('meta[name="csrf-token"]').attr('content'); 
    } 
</script> 

En su principal JS, a continuación, puede llamar authToken(), y va a volver su token de autenticidad como una cadena para incluir en sus llamadas Ajax. Por ejemplo, usando jQuery:

$.ajax({ 
    type: 'PUT', 
    url: url, 
    data: { 
    foo: bar, 
    authenticity_token: authToken() 
    }, 
    complete: function(data) {} 
}); 

Tenga en cuenta que si utiliza los carriles integrado en un form_for ayudante, se añade automáticamente el token de autenticidad en una entrada oculta. Si desea enviar todos los datos del formulario, incluyendo el token de autenticación oculta, puede simplemente usar:

var $form = $('form'); 
$.ajax({ 
    url:  $form.attr('action'), 
    type:  $form.attr('method'), 
       // "get" or "post"; overridden by Rails' hidden "_method" 
       // input value, e.g., "put" 
    data:  $form.serialize(), 
       // Includes hidden "authenticity_token" and "_method" inputs 
    complete: function(data) {} 
}); 

Este patrón es a menudo útil cuando ya ha escrito una forma que funciona sin JS, y usted' Estamos agregando una capa discreta de JS que simplemente envía los datos del formulario a través de Ajax.

+0

¡Genial, gracias una tonelada! Trabajado como un encanto. –

3

Gracias por la solución anterior.
Estoy usando algunos formularios estándar en mi sitio que no usan los rieles form_tag, así que en su lugar simplemente los agregué como un elemento de formulario oculto.

<form action="..."> 
    <%= hidden_field_tag 'authenticity_token', form_authenticity_token if protect_against_forgery? %> 
    ... rest of form... 
</form> 

Works a treat.

Cuestiones relacionadas