我在rails 5中获得了ActionController::InvalidAuthenticityToken
。它正常工作了一段时间,然后就放弃了工作。
# Application Controller
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
end
我正在使用rails form helper,并传入一个表单对象
# price_history/new.html.erb
<%= form_for @price_history_form, url: 'price_history' do |f| %>
...
<% end %>
我可以看到在html中生成的真实性令牌,并传递给控制器..
class PriceHistoriesController < ApplicationController
我不知道为什么会这样。有什么想法吗?
答案 0 :(得分:2)
尝试禁用Turbolinks。你在运行什么版本的Rails?
有关禁用turbolinks的帮助,请参阅此处:How to disable turbolinks in Rails 5?
答案 1 :(得分:2)
对于其他可能发现此问题的人来说......有两个问题。
Turbo链接添加'data-no-turbolink' => true
,然后是网址:需要以/
答案 2 :(得分:1)
问题在于:url
选项。根据这个Rails问题,当你使用它时会引发错误:
https://github.com/rails/rails/issues/24257
显然这个问题有两个解决方案:
1)禁用表单中的Turbolink('data-no-turbolink' => true
)
2)从呈现链接或表单的控制器操作中删除render stream: true
答案 3 :(得分:0)
不确定该问题的内部原因,但是此js为我修复了该问题(启用了Turbolink的Rails 5.1):
$(document).on("turbolinks:load",function() {
$.rails.refreshCSRFTokens();
})
它更新头csrf令牌,使其与形式的csrf令牌匹配。 来自这里的想法:https://github.com/rails/jquery-ujs/issues/456
答案 4 :(得分:0)
一个简单的修复方法,无需使用Rails本地UJS实现禁用Turbolinks:
$(document).on('turbolinks:load', function() {
Rails.refreshCSRFTokens();
});