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

时间:2013-10-18 15:01:33

标签: ruby-on-rails ruby-on-rails-4

我有两个带有选项remote: true的表单;一个向create动作发送Ajax请求,另一个向destroy动作发送Ajax请求。

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

ActionController::InvalidAuthenticityToken PersonsController#create

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

注意:我使用的是Rails 4

更新

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

4 个答案:

答案 0 :(得分:113)

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

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

答案 1 :(得分:28)

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

 ActionController::InvalidAuthenticityToken

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

 config.action_view.embed_authenticity_token_in_remote_forms = true

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

答案 2 :(得分:4)

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

 <%= csrf_meta_tags %>

答案 3 :(得分:1)

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

如果您按form_tag制作表单,则会出现这种情况。更好的方法是使用form_for作为资源(db中的新对象或现有对象),并且Rs自动构建csrf字段。