【问题标题】:ActionController::InvalidAuthenticityToken in Rails 5Rails 5 中的 ActionController::InvalidAuthenticityToken
【发布时间】:2017-11-13 09:22:13
【问题描述】:

我在 rails 5 中得到了ActionController::InvalidAuthenticityToken。它正常工作了一段时间,然后就放弃了工作。

# Application Controller
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
end

我正在使用 rails 表单助手,并传入一个表单对象

# price_history/new.html.erb
<%= form_for @price_history_form, url: 'price_history' do |f| %>
  ...
<% end %>

我可以看到在 html 中生成的真实性令牌,并传递到控制器中..

class PriceHistoriesController < ApplicationController

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

【问题讨论】:

  • 在什么情况下你会得到这个错误?还是你总是得到它?
  • 嗨@AlexanderLuna 现在提交每个表单。我已经多次重启服务器,关闭浏览器等。
  • @mark 你明白了吗?如果是这样,请随时提交您自己的答案或标记正确答案,以便遇到相同问题的其他人更容易找到解决方案。
  • @OneNeptune,是的 turbolinks + :url 选项!谢谢

标签: ruby-on-rails ruby


【解决方案1】:

无需禁用带有 Rails 原生 UJS 实现的 Turbolinks 的简单修复:

$(document).on('turbolinks:load', function() {
    Rails.refreshCSRFTokens();
});

【讨论】:

  • 这应该是此类问题的公认答案。谢谢@Phitherek_!
【解决方案2】:

对于其他可能发现此问题的人。有两个问题。

Turbo 链接添加 'data-no-turbolink' =&gt; true,然后是 url: 需要以 / 开头

【讨论】:

  • "url: 需要以 / 开头" - 这就是为我解决的问题!
【解决方案3】:

不确定问题的内部,但这个 js 为我修复了它(启用了 turbolinks 的 rails 5.1):

$(document).on("turbolinks:load",function() {
  $.rails.refreshCSRFTokens();  
})

它会更新 head csrf 令牌,使其匹配表单 csrf 令牌。 来自这里的想法:https://github.com/rails/jquery-ujs/issues/456

【讨论】:

    【解决方案4】:

    尝试禁用 Turbolinks。你运行的是什么版本的 Rails?

    有关禁用 turbolink 的帮助,请参阅此处:How to disable turbolinks in Rails 5?

    【讨论】:

    • 禁用某个功能来解决问题几乎不是答案。需要有一个正确的答案。
    【解决方案5】:

    问题在于:url 选项。根据this Rails issue,使用时会引发该错误:

    https://github.com/rails/rails/issues/24257

    显然这个问题有两种解决方案:

    1) 在表单中禁用 Turbolinks ('data-no-turbolink' =&gt; true)

    2) 从呈现链接或表单的控制器操作中删除render stream: true

    【讨论】:

      猜你喜欢
      • 2018-11-02
      • 2016-11-14
      • 1970-01-01
      • 2017-04-12
      • 2018-11-27
      • 2015-05-21
      • 2017-09-07
      • 2019-09-25
      • 2015-11-23
      相关资源
      最近更新 更多