Добавьте в свой макет перед запуском любой другой 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.