【发布时间】: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