【问题标题】:Ruby on Rails: 301 redirect variable underscore URLs to hypen URLsRuby on Rails:301 将变量下划线 URL 重定向到连字符 URL
【发布时间】:2020-08-25 21:36:11
【问题描述】:

This question 相似但不一样。

假设像 /test/foo_bar 和 /test/foo_bar/8 这样的路由。

routes.rb 的路线如下:

  get "/test/:id1/:id2", to: "test#super"
  get "/test/:id1", to: "test#duper"

如果目标是将下划线 URL 301 重定向到连字符版本(例如,/test/foo_bar -> /test/foo-bar),是否有 Rails 方法以编程方式执行此操作?还是需要手动为老的下划线路由创建301路由?

这适用于 Rails 6.x。

【问题讨论】:

  • 你想要做的不是重定向到我。因为“foo_bar”只是一个参数(id1)。参数通常是用户在创建记录时提交或由应用分配的。如果您认为某些参数不再像以前那样有效(带有下划线),那么您可以在数据库中批量更改它们,并在用户提交时警告用户。
  • 或者,在控制器方法(duper 或 super)中,只需在针对数据库中的任何内容进行测试之前修改参数。由于将“/test/foo_bar”重定向到“/test/foo-bar”仍然在ping相同的路由:测试控制器和duper方法。
  • ........如果我理解正确,你不需要做重定向。你可以直接在你的路由文件中应用它。即`get "/test/foo_bar", to: "test#foobar"; get "/test/foo-bar", to: "test#foobar" - 你会注意到两条路由都指向同一个控制器动作。如果您的需求变得更加复杂,那么我相当有信心您可以使用各种约束 (guides.rubyonrails.org/routing.html#segment-constraints) 来解析您的路线并指向正确的路线。如果 foo-bar 或 foo_bar 实际上意味着您的数据库中的某些东西,Maxence 也有一个解决方案。
  • @Maxence 感谢您的帮助,但不幸的是,这些都没有保存在数据库中,我们无法提醒用户。我们可以以编程方式将下划线路由重新映射到连字符路由,还是我们需要手动重定向到达路由?
  • @BKSpureon 是的,一种解决方案是手动定义路线,但我们希望尽可能避免这种情况,因为有一些。是否可以以编程方式将这些下划线路由重定向到它们的 hypen 版本?

标签: ruby-on-rails rubygems ruby-on-rails-6


【解决方案1】:

您可以尝试这样的事情(未经测试):

 get '/test/:id1', to: redirect { |path_params, req| "/test/#{path_params[:id1].dasherize}" }
 get '/test/:id1/:id2', to: redirect { |path_params, req| "/test/#{path_params[:id1].dasherize}/#{path_params[:id2]}" }

我不喜欢这种方法:感觉很老套……但它可能对你有用。

【讨论】:

    猜你喜欢
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    相关资源
    最近更新 更多