我有一些
javascript在我的Rails网站做一个ajax调用:
$.ajax({type: "PUT",url: url,data: { dummy: data },complete: function(data) {}});
当Rails得到它时,它会抛出一个ActionController :: InvalidAuthenticityToken错误.如果可能,我想保留在…的… … … …但是,如何从JavaScript文件传递auth令牌?
谁能帮我吗?
解决方法
在您的布局中,在任何其他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帮助器,它将自动将隐私输入中添加真实性令牌.如果您要发送所有表单的数据,包括隐藏的auth令牌,您可以简单地使用:
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发送表单的数据.