我刚刚在Rails 5.0.0beta3上创建了一个带有几个表单的简单应用程序。
在开发中,使用Safari或Chrome上的http://localhost:3000访问应用,如果我填写表单并提交,我总会收到ActionController::InvalidAuthenticityToken
错误。
但是,如果我在填写并提交之前重新加载页面,那么它可以正常工作。
该应用使用默认值:
protect_from_forgery with: :exception
,<%= 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)
如果我在控制器(self.per_form_csrf_tokens = false
)中禁用每个表单CSRF令牌,它可以正常工作,所以我的问题确实在那个级别。
会话似乎不会在任何时候重置。
有趣的是,首次加载表单时,标题的menage标记中的真实性标记与表单中的标记不同。元标记也位于标题标记的底部。 当我重新加载标记时,元标记和表单中的标记相同,并且元标记位于标题标记的顶部。
更新
我认为问题归咎于Turbolinks。
当从应用程序中的另一个页面访问表单页面时,Turbolinks会触发XHR请求,我遇到了这个问题。
然而,当我重新加载页面时,浏览器会重新加载它,而我却看不到问题。
答案 0 :(得分:6)
答案 1 :(得分:0)
您可以尝试按https://github.com/heartcombo/devise/issues/5273此处所述运行res = []
extra_val = '#'
max_len = float('-inf')
for each in l:
max_len = max(max_len, len(each))
for each in l:
if len(each) < max_len:
n = max_len - len(each)
extra_list = [extra_val]*n
each.extend(extra_list)
for i in range(max_len):
for j in range(len(l)):
if l[j][i] != extra_val:
res.append(l[j][i])
print(res)
我也尝试过,它已经在三台不同的机器上为我工作,其中包括带有Ubuntu 20.04的Windows WSL。
尽管如此,我仍在设法解决它解决问题的原因。