Rails 路由重定向单个和通配符路径

Jon*_*web 0 ruby redirect ruby-on-rails

在我的 Rails 应用程序中,config/routes.rb我试图重定向任何/support/contact. 因此,用户/support/a/b将重定向到/contact/a/b并且/support将重定向到/contact.

到目前为止,这可以通过以下两条路线实现:

get '/support*all' => redirect(path: '/contact%{all}')
get '/support' => redirect(path: '/contact')
Run Code Online (Sandbox Code Playgroud)

我的问题是,是否有可能有一条路线与上述两条路线相似?

7st*_*tud 7

括号用于使段可选:

get '/support(/*all') => redirect(path: '/contact/%{all}')
Run Code Online (Sandbox Code Playgroud)

但是redirect()如果all什么都不匹配就会产生错误,即当路径是/support. 在这种情况下,重定向路径将是字面上的 -- 不进行'/contact/%{all}'替换。所以你需要提供一个默认值all(注意这defaults:get()方法的参数):

get '/support(/*all)', to: redirect(path: "/contact/%{all}"), defaults: {all: ''}
Run Code Online (Sandbox Code Playgroud)

您还可以为该redirect()方法提供一个块,该块的返回值将用作重定向路径:

get '/support(/*all)', to: redirect {|path_params, req|  #Cannot use do-end to delimit this block.
  "/contact/#{path_params[:all]}"
}
Run Code Online (Sandbox Code Playgroud)

关于块解决方案要注意的是,当all最终没有匹配路径中的任何内容时,allparams Hash中将没有条目,因此path_params[:all]将返回nil. 随后,当您插入nil一个字符串时,调用 nil.to_s,它返回一个空字符串。