Ruby on rails Rails路由为单个路径和通配符路径重定向
在我的Rails应用程序的Ruby on rails Rails路由为单个路径和通配符路径重定向,ruby-on-rails,ruby,redirect,Ruby On Rails,Ruby,Redirect,在我的Rails应用程序的config/routes.rb中,我试图将任何以/support开头的url重定向到/contact。因此,前往/support/a/b的用户将重定向到/contact/a/b,前往/support的用户将重定向到/contact 到目前为止,有以下两条路线可以实现这一点: get '/support*all' => redirect(path: '/contact%{all}') get '/support' => redirect(path: '/co
config/routes.rb
中,我试图将任何以/support
开头的url重定向到/contact
。因此,前往/support/a/b
的用户将重定向到/contact/a/b
,前往/support
的用户将重定向到/contact
到目前为止,有以下两条路线可以实现这一点:
get '/support*all' => redirect(path: '/contact%{all}')
get '/support' => redirect(path: '/contact')
我的问题是,是否有可能有一条路线的行为与上述两条路线类似?括号用于使线段成为可选的:
get '/support(/*all') => redirect(path: '/contact/%{all}')
但是如果all
与任何内容都不匹配,即路径为/support
时,则redirect()
将产生错误。在这种情况下,重定向路径实际上是'/contact/%{all}'
——不进行替换。因此,您需要为all
提供一个默认值(注意defaults:
是get()
方法的一个参数):
您还可以为redirect()
方法提供一个块,该块的返回值将用作重定向路径:
get '/support(/*all)', to: redirect {|path_params, req| #Cannot use do-end to delimit this block.
"/contact/#{path_params[:all]}"
}
关于块解决方案需要注意的是,当
all
与路径中的任何内容都不匹配时,params散列中的all
将没有条目,因此path\u params[:all]
将返回nil
。随后,当您将nil
插入字符串时,将调用,返回一个空白字符串。@Simon Franzen,在我回答时没有看到您的答案。--啊。别担心,太棒了,我来试试!我会向你汇报事情的进展,这很有效。谢谢@7stud!我在默认值散列中进行了传递。块示例稍后可能会派上用场。谢谢你把它包括进来!
get '/support(/*all)', to: redirect {|path_params, req| #Cannot use do-end to delimit this block.
"/contact/#{path_params[:all]}"
}