当我尝试设置请求标头令牌时,收到错误:
ActionController::RoutingError (No route matches [OPTIONS] "/data"):
这是ajax调用:
$.ajax({
url: this.hostName + url,
type: 'POST',
data: data,
dataType: 'json',
beforeSend: function( xhr ) {
xhr.setRequestHeader( 'X-CSRF-Token', $( 'meta[name="csrf-token"]' ).attr( 'content' ) );
},
success: function(response) {
console.log('success');
console.log(response);
},
error: function(response) {
console.log('error');
console.log(response);
}
});
如果我退出请求标题:
Started POST "/data" for 127.0.0.1 at 2012-07-24 18:37:22 -0700
但我收到警告说:
WARNING: Can't verify CSRF token authenticity
有关为何发生这种情况的任何想法?
答案 0 :(得分:1)
你试过吗
$.ajax({
url: this.hostName + url,
type: 'POST',
headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') }
data: { param : 'something' },
dataType: 'json'
});
然后在你的控制器中,params [:param]会给你'某事'。
如果您有兴趣知道为什么需要所有X-CSRF-Token内容,this是一个很好的阅读。基本上,Rails会自动在页面中包含该令牌,以确保您的应用程序安全。如果您检查网站的任何页面,您会在HTML文档的头部看到如下内容:
<meta content="guma1QdmO9Tn9SB4yV4DonkY4xf4Sy6lIvrFyHIaR1U=" name="csrf-token">
这是由<%= csrf_meta_tags %>
文件中包含的行application.html.erb
创建的。
Rails会在常规非GET请求中自动包含此令牌,以确保其安全。但是使用javascript和ajax,你必须通过使用jQuery函数$('meta[name="csrf-token"]'
在DOM中搜索令牌来手动执行此操作。
现在,这不是很有效,因为您每次发出请求时都在搜索该令牌。所以你应该做的是使用ajaxSetup,如下所示:
$.ajaxSetup({
type: 'POST',
headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') }
dataType: 'json'
});
现在,无论何时您想发送请求,您只需要:
$.ajax({
url: this.hostName + url,
data: { param : 'something' }
});
编辑:啊,我明白了。你alert(this.hostName + url)
做什么?你是如何宣布自己的路线的?因为如果我没记错,你可以使用相对网址而不是绝对网址,你不需要根部分。这是一个例子:
# routes.rb
post "relative_url" => 'controller#action'
# file.js
$.ajax({
url: "relative_url",
data: { param : 'something' }
});
答案 1 :(得分:1)
你应该尝试在ajax中提供相对url而不是绝对。我有同样的问题,并通过更改网址
工作