在我的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')
我的问题是,是否有可能有一条行为与上述两条路线相似?
答案 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,它将返回一个空字符串。