Rails 5中的ActionController :: InvalidAuthenticityToken

时间:2017-06-12 01:37:34

标签: ruby-on-rails ruby

我在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

我不知道为什么会这样。有什么想法吗?

5 个答案:

答案 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();
});