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

我有两种forms与选项remote: true ; 一个发送一个Ajax请求来create动作,另一个发送一个Ajax请求来destroy动作。

所有的工作罚款,当启用JavaScript,但如果我禁用JavaScript,然后点击,我得到这个错误:

 ActionController::InvalidAuthenticityToken PersonsController#create 

为什么显示这个错误,我该如何解决?

注意:我正在使用Rails 4

更新

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

奇怪的是,这个行为在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 %> 

如果closuresJavascript,添加这个选项可以让你正常降级到一个HTML后备。

我也面临同样的问题。 我用form_tag来创build自定义的远程窗体,但我得到了以下错误,

  ActionController::InvalidAuthenticityToken 

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

  config.action_view.embed_authenticity_token_in_remote_forms = true 

在提交远程表单时会自动validation这个托pipe。 这为我解决了这个问题。 希望这将有助于一个人。

在我的情况下,我只需要在我的页面中添加这一行:

  <%= csrf_meta_tags %> 

如果表单内没有csrf字段(隐藏字段),则Rails服务器无法对提交进行身份validation。

如果你通过form_tag制作表单,这种情况就会发生。 更好的方法是使用form_for的资源(新的对象或数据库中的现有对象)和csrf字段将由Rails自动生成。

众所周知,这些function是为了安全和防伪目的而添加的。
但是,要回答你的问题,这里有一些input。 您可以在控制器名称后添加这些行。

像这样,

 class NameController < ApplicationController skip_before_action :verify_authenticity_token 

这里有一些不同版本的导轨。

Rails 3

skip_before_filter:verify_authenticity_token

Rails 4

skip_before_action:verify_authenticity_token

如果您打算为所有控制器例程禁用此安全function,则可以在application_controller.rb文件中将protect_from_forgery的值更改:null_session

像这样,

 class ApplicationController < ActionController::Base protect_from_forgery with: :null_session end