禁用JS/Ajax请求时,ActionController :: InvalidAuthenticityToken

med*_*zid 39 ruby-on-rails ruby-on-rails-4

我有两种选择形式remote: true; 一个发送Ajax请求以执行create操作,另一个发送Ajax请求以执行destroy操作.

启用JavaScript后所有工作都会被罚款,但如果我禁用JavaScript,那么我点击,我收到此错误:

ActionController::InvalidAuthenticityToken PersonsController#create
Run Code Online (Sandbox Code Playgroud)

为什么会显示此错误,如何解决?

注意:我正在使用Rails 4

更新

当我使用没有选项的普通表单时remote: true,rails会自动为身份验证令牌插入一个隐藏字段,但是当我remote: true在表单中使用时,HTML代码中没有这样的字段.看起来当有remote选项时,Rails会以不同的方式处理身份验证令牌,那么我如何才能在两种情况下都能使用它?

Dan*_*and 117

奇怪的是,这种行为在rails 4中被改变了.http://www.alfajango.com/blog/rails-4-whats-new/

Rails表单现在不会在表单中呈现CSRF字段,除非您明确将其定义为表单的选项:

<%= form_for @some_model, :remote => true, :authenticity_token => true do |f| %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

如果关闭Javascript,添加此选项可以优雅地降级为HTML回退.

  • 一旦我将`authenticity_token:true`添加到`bootstrap_form_for`调用,我得到一个'UnknownFormat`错误,这意味着不再识别`remote:true`.以前,我没有在表单上的`authenticity_token:true`并收到错误消息,导致我发表这篇文章.你知道为什么将`authenticity_token:true`添加到`bootstrap_form_for`会导致`remote:true`停止工作吗?表单在html中有`data-remote ="true"`,所以我不确定这里的问题是什么:`UnknownFormat`指向我的`repond_to do | format | format.js end` (3认同)

Abh*_*ram 28

我也遇到了同样的问题.我使用form_tag创建自定义远程表单,但我得到以下错误,

 ActionController::InvalidAuthenticityToken
Run Code Online (Sandbox Code Playgroud)

我发现这是因为在轨道4中默认情况下不会添加真实性,所以我在application.rb文件中添加了以下行,

 config.action_view.embed_authenticity_token_in_remote_forms = true
Run Code Online (Sandbox Code Playgroud)

在提交远程表单时自动验证toke.这解决了我的问题.希望这对一些人有所帮助.

  • http://edgeguides.rubyonrails.org/configuring.html:`config.action_view.embed_authenticity_token_in_remote_forms`的详细解释允许您在表格中设置authenticity_token的默认行为:remote => true.默认情况下,它设置为false,这意味着远程表单将不包含authenticity_token,这在片段缓存表单时很有用.远程表单从元标记中获取真实性,因此除非您支持没有JavaScript的浏览器,否则不需要嵌入.... (6认同)

Che*_*niv 5

就我而言,我只需在我的页面中添加这一行:

 <%= csrf_meta_tags %>
Run Code Online (Sandbox Code Playgroud)