Rails 使用不同布局时真实性令牌无效
Rails Authenticity Token not valid when using a different layout
我有一个 rails 应用程序,它使用模式将 post 数据发送到控制器并将其保存到数据库。在使用我的旧 "original" 布局时,该流程完美运行,但在实施新的 bootstrap 主题布局后,当我尝试提交时,我收到无效的 CRSF 错误。
如果我将控制器上的布局改回原来的布局,它就可以正常工作。
运行该 click/post 方法的 JS 如下:
$(document).on("click",".clickable", function(){
var link = $(this).data('link')
console.log(link);
$.ajax({
url: link,
type: "POST",
});
});
除了控制器的布局外,代码中没有任何变化,就像我提到的,如果我将布局改回原始布局,它就可以正常工作。在新布局的 javascript 中,我是否可能遗漏了 javascript 文件或其他内容?
新布局js文件:stack.js
//= require jquery3
//= require popper
//= require rails-ujs
//= require bootstrap
//= require stack/vendors/vendors.min
//= require stack/vendors/charts/raphael-min
//= require stack/vendors/charts/morris.min
//= require stack/vendors/extensions/unslider-min
//= require stack/vendors/timeline/horizontal-timeline
//= require stack/core/app-menu
//= require stack/core/app
//= require stack/scripts/pages/dashboard-ecommerce
//= require_tree ./common
旧布局 js 文件:application.js
//= require jquery3
//= require popper
//= require rails-ujs
//= require bootstrap
//= require_tree ./common
所有特定于新模板的 js 文件都在 javascripts 主文件夹下的 "stack" 文件夹中,这就是为什么上面只包含 ./common 的原因。我不想包含堆栈下的所有文件,因为有很多文件我还没有连接或删除。
有什么想法吗?
错误:
Started POST "/add_interest?city_id=59020&name=Mission+District%2C+San+Francisco%2C+California%2C+US®ion_id=128085&type=region" for 127.0.0.1 at 2019-02-16 13:30:02 -0800
Processing by InterestsController#create as */*
Parameters: {"city_id"=>"59020", "name"=>"Mission District, San Francisco, California, US", "region_id"=>"128085", "type"=>"region"}
Can't verify CSRF token authenticity.
Completed 422 Unprocessable Entity in 1ms (ActiveRecord: 0.0ms)
ActionController::InvalidAuthenticityToken - ActionController::InvalidAuthenticityToken:
`
这样试试:
$(document).on("click",".clickable", function(){
var link = $(this).data('link')
console.log(link);
$.ajax({
url: link,
beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))},
method: "POST",
dataType: "json",
data: {}
});
});
由于您使用的是 Rails-ujs,因此您可以使用它的 ajax
方法,该方法已经为您处理了令牌:
$(document).on("click",".clickable", function(){
var link = this.dataset.link;
console.log(link);
Rails.ajax({
url: link,
type: "POST",
});
});
我有一个 rails 应用程序,它使用模式将 post 数据发送到控制器并将其保存到数据库。在使用我的旧 "original" 布局时,该流程完美运行,但在实施新的 bootstrap 主题布局后,当我尝试提交时,我收到无效的 CRSF 错误。
如果我将控制器上的布局改回原来的布局,它就可以正常工作。
运行该 click/post 方法的 JS 如下:
$(document).on("click",".clickable", function(){
var link = $(this).data('link')
console.log(link);
$.ajax({
url: link,
type: "POST",
});
});
除了控制器的布局外,代码中没有任何变化,就像我提到的,如果我将布局改回原始布局,它就可以正常工作。在新布局的 javascript 中,我是否可能遗漏了 javascript 文件或其他内容?
新布局js文件:stack.js
//= require jquery3
//= require popper
//= require rails-ujs
//= require bootstrap
//= require stack/vendors/vendors.min
//= require stack/vendors/charts/raphael-min
//= require stack/vendors/charts/morris.min
//= require stack/vendors/extensions/unslider-min
//= require stack/vendors/timeline/horizontal-timeline
//= require stack/core/app-menu
//= require stack/core/app
//= require stack/scripts/pages/dashboard-ecommerce
//= require_tree ./common
旧布局 js 文件:application.js
//= require jquery3
//= require popper
//= require rails-ujs
//= require bootstrap
//= require_tree ./common
所有特定于新模板的 js 文件都在 javascripts 主文件夹下的 "stack" 文件夹中,这就是为什么上面只包含 ./common 的原因。我不想包含堆栈下的所有文件,因为有很多文件我还没有连接或删除。
有什么想法吗?
错误:
Started POST "/add_interest?city_id=59020&name=Mission+District%2C+San+Francisco%2C+California%2C+US®ion_id=128085&type=region" for 127.0.0.1 at 2019-02-16 13:30:02 -0800
Processing by InterestsController#create as */*
Parameters: {"city_id"=>"59020", "name"=>"Mission District, San Francisco, California, US", "region_id"=>"128085", "type"=>"region"}
Can't verify CSRF token authenticity.
Completed 422 Unprocessable Entity in 1ms (ActiveRecord: 0.0ms)
ActionController::InvalidAuthenticityToken - ActionController::InvalidAuthenticityToken:
`
这样试试:
$(document).on("click",".clickable", function(){
var link = $(this).data('link')
console.log(link);
$.ajax({
url: link,
beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))},
method: "POST",
dataType: "json",
data: {}
});
});
由于您使用的是 Rails-ujs,因此您可以使用它的 ajax
方法,该方法已经为您处理了令牌:
$(document).on("click",".clickable", function(){
var link = this.dataset.link;
console.log(link);
Rails.ajax({
url: link,
type: "POST",
});
});