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

时间:2018-01-20 19:15:36

标签: ruby-on-rails ruby redirect

在我的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')

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

1 个答案:

答案 0 :(得分:3)

括号用于使段可选:

get '/support(/*all') => redirect(path: '/contact/%{all}')

redirect()如果all没有匹配,即路径为/support时,'/contact/%{all}'会产生错误。在这种情况下,重定向路径将按字面意思all - 不进行替换。因此,您需要为defaults:提供默认值(请注意get()get '/support(/*all)', to: redirect(path: "/contact/%{all}"), defaults: {all: ''} 方法的参数):

redirect()

您还可以为get '/support(/*all)', to: redirect {|path_params, req| #Cannot use do-end to delimit this block. "/contact/#{path_params[:all]}" } 方法提供一个块,块的返回值将用作重定向路径:

all

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