【问题标题】:Rails `link_to` with `method` parameter gives 404 when open in new tab在新选项卡中打开时,带有 `method` 参数的 Rails `link_to` 会给出 404
【发布时间】:2020-01-13 23:41:13
【问题描述】:

使用 Ruby 2.5.1/Rails 5.2.4.1 我生成了一个新的 Rails 应用程序,并编辑/创建了以下文件:

# config/routes.rb
Rails.application.routes.draw do
  root 'some#home'
  post 'foo' => 'some#foo'
end
# app/controllers/some_controller.rb
class SomeController < ApplicationController
  def foo; end
end
# app/views/some/home.html.erb
<%= link_to 'Do stuff', foo_path, method: :post %>

如果我正常单击此链接,它会发出 POST 请求并给出成功响应 (204),正如预期的那样。

如果我单击以在新选项卡中打开它(中间单击/右键单击和“在新选项卡中打开链接”),它会发出 GET 请求并给出 404/RoutingError。

这种不同的行为取决于我如何打开(默认情况下对用户显示的内容)一个正常链接似乎令人惊讶 - 这是预期的行为吗?我猜这与使用 Rails UJS 的链接有关,并且在打开新选项卡时表现不同?在 Rails 中,获取(看起来是什么样的)一个可以创建 POST 的链接的最佳方式是什么,无论它是如何打开的?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-5 rails-ujs jquery-rails


    【解决方案1】:

    右键单击并“在新标签中打开链接”就像复制链接并粘贴到新标签中一样。因此,它充当 get 方法。

    由于您只接受 post-method,因此会发生 RoutingError。

    顺便说一句,如果您想在新标签页中打开帖子链接,可以使用 target='_blank'。

    【讨论】:

    • 好点,我以前没有这样考虑过,但这是有道理的。我想我以后应该小心地将link_to 与非 GET 方法一起使用,因为这样做似乎有点麻烦。
    • 提醒target='_blank'可能会导致security vulnerabilities
    • 他仍然是被重定向页面的所有者(foo_path),所以我猜这里不适用。但是谢谢你的提醒。
    • 值得指出的是,虽然target='_blank' 表示当 POST 链接正常打开时会发生预期的行为(它在新选项卡中成功打开),但如果用户尝试显式打开,原始问题仍然存在它在一个新标签中。
    猜你喜欢
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    相关资源
    最近更新 更多