Padrino框架中如何用单路由代码处理多个URL?
解决Sinatra中单个路由处理多个URL的问题
这个问题我之前在项目里也踩过坑——Sinatra的路由语法并不支持直接把多个路径字符串作为参数传给get方法,你写的get '/company', '/about' do ... end之所以失效,是因为第二个参数'/about'会被Sinatra当成路由选项哈希来处理(比如用来设置:condition或者:provides这类配置),根本不会被识别成另一个路由路径,这就导致/about没有对应的处理逻辑,返回404。
下面给你两种常用的可行实现方式:
方法一:使用正则表达式匹配多个路径
直接用正则表达式来定义匹配多个路径的路由模式,这种方式简洁高效:
get %r{/(company|about)} do # 这里写你的处理逻辑,比如渲染同一个页面或者返回相同内容 "这是公司介绍或关于我们页面" end
这个正则表达式/(company|about)会精准匹配/company和/about两个路径,都会触发同一个处理代码块。如果需要更复杂的匹配规则,还可以扩展正则的写法。
方法二:抽离公共逻辑,分别定义路由
如果以后可能需要给某个路径单独添加特殊逻辑,推荐把公共处理逻辑抽成一个方法,然后给每个路径单独定义路由:
# 抽离公共处理逻辑 def render_about_or_company_page # 比如渲染erb模板,或者返回统一的响应内容 erb :company_about_template end # 分别给两个路径绑定路由 get '/company' do render_about_or_company_page end get '/about' do render_about_or_company_page end
这种方式的优势是逻辑清晰,扩展性强——比如哪天要给/about加个访问统计,直接在对应的get '/about'块里加代码就行,不会影响/company的逻辑。
另外要注意,如果你用的是Sinatra的模块化风格(不是经典风格),写法本质上是一样的,只是要在模块里定义路由即可。
内容的提问来源于stack exchange,提问作者Levi
相关产品推荐
相关产品推荐

