44

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

启用 JavaScript 后一切正常,但如果我禁用 JavaScript,然后单击,我会收到此错误:

ActionController::InvalidAuthenticityToken PersonsController#create

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

注意:我使用的是 Rails 4

更新

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

4

4 回答 4

122

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

于 2013-11-08T11:52:52.843 回答
32

我也面临同样的问题。我使用 form_tag 创建自定义远程表单,但出现以下错误,

 ActionController::InvalidAuthenticityToken

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

 config.action_view.embed_authenticity_token_in_remote_forms = true

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

于 2014-06-18T11:16:33.660 回答
5

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

 <%= csrf_meta_tags %>
于 2016-05-29T13:38:22.277 回答
0

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

如果按 制作表格form_tag,就会出现这种情况。更好的方法是使用form_for资源(数据库中的新对象或现有对象),并且 csrf 字段将由 Rails 自动构建。

于 2013-10-18T15:32:32.170 回答