我刚刚在 Rails 5.0.0beta3 上启动了一个带有几个表单的简单应用程序。
在开发中,使用 http://localhost:3000在 Safari 或 Chrome 上访问该应用程序,如果我填写表单并提交,我总是收到 ActionController::InvalidAuthenticityToken
错误。
但是,如果我在填写和提交之前重新加载页面,那么它工作正常。
该应用程序使用默认值:
protect_from_forgery with: :exception
在应用程序 Controller 中,<%= csrf_meta_tags %>
在通过应用程序布局的 html 标题中,例子:
<%= 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)
如果我在 Controller (
self.per_form_csrf_tokens = false
)中禁用 per form CSRF token ,它工作正常,所以我的问题确实在那个级别。session 似乎没有在任何时候重置。
有趣的是,当表单第一次加载时,header 的menage 标签中的真实性标记与表单中的标记不同。元标记也位于标题标记的底部。
当我重新加载元标记和表单中的标记时,元标记是相同的,并且元标记位于标题标记的顶部。
更新:
我认为问题归结于 Turbolinks。
当从应用程序中的另一个页面访问表单页面时,Turbolinks 会触发 XHR 请求,我遇到了这个问题。
但是,当我重新加载页面时,浏览器会重新加载它,但我没有看到问题。
最佳答案
我在 Rails 上提出了一个问题。
经过进一步调查,问题似乎是由选项 :url
引起的。在 form_for
.
见:Issue #24257 (还没解决)
关于ruby-on-rails - Rails 5.0.0beta3:开发中的 ActionController::InvalidAuthenticityToken,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36112939/