Rails link_to 由于真实性令牌无效,销毁方法失败

Rails link_to destroy method fails due to invalid authenticity token

我有以下生成按钮的 haml 代码:

= link_to 'Delete',
        MODEL_path(MODEL),
        class: 'data-type-button btn btn-negative',
        data: { confirm: 'delete it now!!! ... ?' },
        method: :delete

按下生成的删除按钮并通过弹出窗口确认我确实要继续删除后,我被带到了一个错误屏幕。此屏幕告诉我我有一个无效的真实性令牌。 link_to 替换为 button_to 的相同代码,但是,它可以正常工作并且项目被删除。

我希望它是 link_to 而不是 button_to 因为生成的 HTML 代码排列的方式。我怎样才能让 link_to 工作?

事实证明,link_to通过路径后面括号内的内容传递参数。因此,为了在使用 link_to 的同时获得作为参数传递的真实性令牌,您可以对该代码进行以下修改

= link_to 'Delete',
        MODEL_path(id: MODEL.id, authenticity_token: form_authenticity_token),
        class: 'data-type-button btn btn-negative',
        data: { confirm: 'Delete it now!!! ... ?' },
        method: :delete

当我 post 提出这个问题时,我实际上知道答案,但是在花了很多时间试图弄清楚这个问题并且没有在任何地方直接在 google 上找到解决方案之后,我想post 我的解决方案可以帮助那里的任何其他迷失的灵魂。我不知道这是否是本网站上的不良做法,但如果它对某人有帮助,那么我可以接受。

确认您的布局和 HTML HEAD 部分中有 csrf 元标记。

= csrf_meta_tag

很久以后,发现以下解决了我的问题:

link_to(method: xxx) 生成一个 link 与 javascript 一起工作但不会很好地降级为 no-javascript:

参见 https://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to,在方法选项下注释:

Note that if the user has JavaScript disabled, the request will fall back to using GET....

button_to(method: xxx) 确实生成了一个没有 javascript 的表格。

这种差异可能会以奇怪的方式反噬您(例如,如果您为测试关闭了伪造保护,则使用 link_to(方法) 的 rack-test 系统测试可能无法正常工作,而等效项确实适用于 button_to(method))

请注意,很有可能在 a 中设置按钮样式,使其看起来与 link 相同。使用 bootstrap 非常容易(.btn.btn-link 或任何使 abutton/input[type=submit] 显示相同的东西)。表单元素上自动提供的 class of button_to 也有帮助。