2009-04-08 5 views
13

У меня есть некоторые JavaScript делает вызов AJAX на моем сайте Rails:protect_from_forgery & Ненавязчивый Javascript

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

Когда Rails получает, он отбрасывает назад в ActionController::InvalidAuthenticityToken Error. Я хотел бы сохранить материал protect_from_forgery там, если это возможно ... Но я не понимаю, как передать токен аутентификации из файла javascript?

Может ли кто-нибудь помочь мне?

ответ

21

В макете добавить это перед любой другой JS работает:

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

authToken кодируются как функция, так что это менее вероятно, вы случайно перезаписать его с другим JavaScript.

Альтернативно, как в Rails 3, токен аутентификации врезана как <meta> тег, который вы можете прочитать с:

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

В главной JS, вы можете позвонить authToken(), и он вернется ваш токен аутентификации в качестве строки для включения в ваши вызовы Ajax. Например, с помощью JQuery:

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

Обратите внимание, что если вы используете Rails' встроенный в form_for помощника, он автоматически добавляет маркер подлинности в скрытом ввода. Если вы хотите отправить все данные в форме, в том числе скрытой токен аутентификации, вы можете просто использовать:

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) {} 
}); 

Эта модель часто бывает полезно, когда вы уже написали форму, которая работает без JS, и вы повторное добавление ненавязчивого слоя JS, который просто отправляет данные формы через Ajax.

+0

Отлично, спасибо тонне! Работал как шарм. –

3

Спасибо за вышеупомянутое решение.
Я использую некоторые стандартные формы на своем сайте, которые не используют рельсы form_tag, поэтому я просто добавил его как скрытый элемент формы.

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

Работы по уходу.

Смежные вопросы