3

长期以来,Railsmethod: :post在 helper 中提供了一个选项link_to:当给出选项时,Rails 会拦截点击并发出 POST 请求,而不是默认的 GET 请求。

然而,由于一些未知的原因,这在 Rails 7 中不起作用:尽管添加method: :post到我的link_to助手,Rails 发送了一个 GET 请求(不是一个 POST 请求)。我认为 Turbo 应该会处理它,但它似乎没有发生。

这是您可以复制的非常简单的步骤:

$ rails new example_app
$ bin/rails g scaffold Book title
$ bin/rails db:create && bin/rails db:migrate
$ echo "<%= link_to "New book", new_book_path, method: :post %>" >> app/views/books/index.html.erb
$ bin/rails s

现在localhost:3000/books从您的网络浏览器访问,然后单击第二个“新书”链接。我希望得到一个错误(毕竟,我没有配置正确的 POST 路由),但不幸的是,Rails 发出 GET 请求 - 而不是 POST 请求,因为它应该有:

Started GET "/books/new" for ::1 at 2021-12-27 17:40:43 +0100
Processing by BooksController#new as HTML
  Rendering layout layouts/application.html.erb
  Rendering books/new.html.erb within layouts/application
  Rendered books/_form.html.erb (Duration: 9.1ms | Allocations: 5216)
  Rendered books/new.html.erb within layouts/application (Duration: 10.2ms | Allocations: 5594)
  Rendered layout layouts/application.html.erb (Duration: 12.9ms | Allocations: 7759)
Completed 200 OK in 25ms (Views: 13.6ms | ActiveRecord: 4.3ms | Allocations: 12404)

为什么会这样?Turbo 不应该拦截链接,并且像 Rails UJS 过去所做的那样,发送 POST 请求吗?

4

3 回答 3

1

在我看来,Rails 7 文档尚未针对 Turbo 和缺少的 UJS 库进行更新。即使link_to 文档明确指出link_to(..., ..., method: :post)应该有效,但它显然没有。

深入研究Turbo 的文档,有一个名为Performing Visits With a different Method的部分,它说使用link_to ..., ..., data: { 'turbo-method' => :post },它确实有效。

于 2021-12-28T07:58:44.687 回答
0

我遇到了类似的问题,但我修复它的方式与这里提出的不同:

固定@rails/ujs

$ bin/importmap pin @rails/ujs

然后在 application.js 添加:

import Rails from "@rails/ujs"
Rails.start()

link_to "...", "...", method: :delete开始为我工作。

当您有一个带有一堆method: 链接的旧版应用程序并且您不想将它们更改为turbo-method:

于 2021-12-29T09:12:19.510 回答
0

Rodrigo Serrano 的回答适用于 POST。但是,如果turbo-method设置了:delete,并且redirect_to在destroy动作中使用,则在302重定向后,会触发destroy重定向到的资源上的动作。

button_to没有这个问题。

我正在使用导轨 7.0.1。有一个未解决的问题https://github.com/hotwired/turbo-rails/issues/259

于 2022-01-22T20:15:51.267 回答