Rails 5.0.0beta3:ActionController::InvalidAuthenticityToken 开发中

Rails 5.0.0beta3: ActionController::InvalidAuthenticityToken in development

我刚刚在 Rails 5.0.0beta3 上启动了一个带有几个表单的简单应用程序。

在开发中,在 Safari 上使用 http://localhost:3000 或 Chrome 访问应用程序,如果我填写并提交表单,我总是会收到 ActionController::InvalidAuthenticityToken 错误。 但是,如果我在填写和提交之前重新加载页面,那么它就可以正常工作。

该应用使用默认值:

示例:

<%= form_for @node, url: admin_book_nodes_url, as: :node do |form| %>
  <%= render "form", f: form %>
  <p><%= form.submit %> or <%= link_to "Cancel", admin_book_nodes_path %></p>
<% end %>

日志:

Started POST "/admin/book/nodes" for ::1 at 2016-03-20 11:54:31 +0000
Processing by Admin::Book::NodesController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"/G5pF6hSPx0Vf21Fi0FCh+VlOcHY4w8C5lmHmwr3NQRjfXUP9/xboybeV3tevmyTyHcwSX8LplU/HgZVGDbGlw==", "node"=>{"parent_id"=>"1", "position"=>"1", "title"=>"lkjlkj", "description"=>"lkjlj", "published"=>"0", "content"=>"lkjlkj"}, "commit"=>"Create node"}
Can't verify CSRF token authenticity
Completed 422 Unprocessable Entity in 1ms (ActiveRecord: 0.0ms)

如果我在控制器 (self.per_form_csrf_tokens = false) 中禁用 per form CSRF 令牌,它工作正常,所以我的问题确实在那个级别。

session 似乎在任何时候都没有被重置。

有趣的是,首次加载表单时,header 的 menage 标签中的真实性令牌与表单中的令牌不同。元标记也位于 header 标记的底部。 当我重新加载元标记和表单中的标记时,元标记位于 header 标记的顶部。

更新:

我认为问题出在 Turbolinks 上。

当从应用程序中的另一个页面访问表单页面时,Turbolinks 会触发 XHR 请求,我遇到了这个问题。

但是,当我重新加载页面时,浏览器会重新加载它,但我没有发现问题。

我在 Rails 上提出了一个问题。

经过进一步调查,问题似乎是由 form_for 中的选项 :url 引起的。

参见:Issue #24257(尚未解决)

您可以尝试 运行 rails dev:cache,如此处所述 https://github.com/heartcombo/devise/issues/5273

我也试过了,它在三台不同的机器上对我有用,包括 Windows WSL 和 Ubuntu 20.04.

不过,我仍在努力找出它解决问题的原因。