【问题标题】:ActionController::InvalidAuthenticityToken when disable JS/Ajax request禁用 JS/Ajax 请求时的 ActionController::InvalidAuthenticityToken
【发布时间】:2013-10-18 15:01:33
【问题描述】:

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

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

ActionController::InvalidAuthenticityToken PersonsController#create

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

注意:我使用的是 Rails 4

更新

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

【问题讨论】:

  • medBo,检查您的表单在 html 输出中是否有 csrf 标记。如果不是,那可能就是原因。
  • @BillyChan 在表单的 html 中没有 csrf 令牌!我正在使用 rails 4 我认为这是设计使然?还是什么?
  • medBo,检查我的更新。

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


【解决方案1】:

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

 <%= csrf_meta_tags %>

【讨论】:

    【解决方案2】:

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

     ActionController::InvalidAuthenticityToken
    

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

     config.action_view.embed_authenticity_token_in_remote_forms = true
    

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

    【讨论】:

    • edgeguides.rubyonrails.org/configuring.html 的精彩解释:config.action_view.embed_authenticity_token_in_remote_forms 允许您在表单中设置authentity_token 的默认行为:remote => true。默认情况下,它设置为 false,这意味着远程表单将不包含authentity_token,这在您对表单进行片段缓存时很有帮助。远程表单从元标记中获取真实性,因此嵌入是不必要的,除非您支持没有 JavaScript 的浏览器......
    【解决方案3】:

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

    【讨论】:

    • 是的@DanGarland 正是由于片段缓存的问题,正如上面链接中的作者所描述的那样:)
    • @DanGarland 谢谢。我遇到了远程表单的问题,在某些情况下,我通过删除数据远程动态转换为非远程表单。
    • 我将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
    • 我有同样的问题@JakeSmith
    • 这是一个老问题,但我遇到了与 Jake Smith 和 @rizidoro 相同的错误——你们中的任何一个人找到解决方案了吗?
    【解决方案4】:

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

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

    【讨论】:

    • 嗨@BillyChan 我的问题不在于ajax 请求,我已经使用remote: true 并且工作正常,我的问题是当我禁用javascript 并尝试提交普通表单等表单时
    猜你喜欢
    • 2018-11-02
    • 2011-03-22
    • 2021-12-20
    • 2018-11-27
    • 2021-07-11
    • 2016-05-12
    • 2015-11-23
    • 2014-01-19
    • 1970-01-01
    相关资源
    最近更新 更多