Ruby on rails RubyonRails:301将变量下划线URL重定向到hypen URL

Ruby on rails RubyonRails:301将变量下划线URL重定向到hypen URL,ruby-on-rails,rubygems,ruby-on-rails-6,Ruby On Rails,Rubygems,Ruby On Rails 6,相似但不相同 假设路由为/test/foo\u bar和/test/foo\u bar/8 routes.rb的路由如下: get "/test/:id1/:id2", to: "test#super" get "/test/:id1", to: "test#duper" 如果目标是301将下划线URL重定向到连字符版本(例如,/test/foo_-bar->/test/foo-bar),是否有Rails方

相似但不相同

假设路由为
/test/foo\u bar
/test/foo\u bar/8

routes.rb
的路由如下:

  get "/test/:id1/:id2", to: "test#super"
  get "/test/:id1", to: "test#duper"
如果目标是301将下划线URL重定向到连字符版本(例如,
/test/foo_-bar
->
/test/foo-bar
),是否有Rails方法以编程方式执行此操作?还是需要手动为旧下划线路由创建301路由


这是针对Rails 6.x的。

您可以尝试以下内容(未经测试):


我不喜欢这种方法:它感觉很粗糙……但它可能适合你。

你可以尝试类似的方法(未经测试):


我不喜欢这种方法:它让人感觉不舒服……但它可能对你有用。

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