Mat*_*nde 13 ajax jquery ruby-on-rails
我有一些javascript在我的Rails网站上进行ajax调用:
$.ajax({type: "PUT", url: url, data: { dummy: data }, complete: function(data) {}});
Run Code Online (Sandbox Code Playgroud)
当Rails得到它时,它会抛出一个ActionController::InvalidAuthenticityToken错误.如果可能的话,我想把protect_from_forgery的内容保留在那里......但是我怎么能从javascript文件中传递auth令牌呢?
谁能帮我吗?
Ron*_*era 21
在你的布局中,在任何其他JS运行之前添加它:
<script>
function authToken() {
return '<%= form_authenticity_token if protect_against_forgery? -%>';
}
</script>
Run Code Online (Sandbox Code Playgroud)
authToken 被编码为一个函数,因此您不太可能用其他JavaScript意外覆盖它.
或者,从Rails 3开始,auth令牌作为<meta>标记嵌入,您可以阅读:
<script>
function authToken() {
return $('meta[name="csrf-token"]').attr('content');
}
</script>
Run Code Online (Sandbox Code Playgroud)
在您的主JS中,您可以调用authToken()它,它将返回您的真实性标记作为字符串以包含在您的Ajax调用中.例如,使用jQuery:
$.ajax({
type: 'PUT',
url: url,
data: {
foo: bar,
authenticity_token: authToken()
},
complete: function(data) {}
});
Run Code Online (Sandbox Code Playgroud)
请注意,如果您使用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) {}
});
Run Code Online (Sandbox Code Playgroud)
当你已经编写了一个没有JS的表单时,这个模式通常很有用,而且你正在添加一个不引人注意的JS层,只需通过Ajax发送表单的数据.
| 归档时间: |
|
| 查看次数: |
2771 次 |
| 最近记录: |