我想创建一个带有完全可选参数的Rails 3路由。示例中断的路线是:
match '(/name/:name)(/height/:height)(/weight/:weight)' => 'people#index'
这导致'rake:routes'屈服:
/(/名称/:名称)(/身高/:高度)(/重量/:重量)
从而为所有链接添加一个初始斜杠:
<a href="//name/kevin">...</a>
如果我将其指定为:
,则该路线有效match '/people(/name/:name)(/height/:height)(/weight/:weight)' => 'people#index'
但我希望将此作为根URL(与第一个示例一样,不起作用)。感谢。
答案 0 :(得分:2)
我不知道是否可以使用Rails的路由引擎完成此操作,但您可以在堆栈中添加自定义中间件,它应该可以正常工作。
将其放入lib/custom_router.rb
class CustomRouter
def initialize(app)
@app = app
end
def call(env)
if env['REQUEST_PATH'].match(/^\/(name|height|weight)/)
%w(REQUEST_PATH PATH_INFO REQUEST_URI).each{|var| env[var] = "/people#{env[var]}" }
end
@app.call(env)
end
end
并添加
config.middleware.use "CustomRouter"
到config/application.rb
。
然后您可以设置路线
match '/people(/name/:name)(/height/:height)(/weight/:weight)' => 'people#index'
它会起作用。
答案 1 :(得分:0)
如果使用单独的根映射,它是否有效?
root :to => 'people#index'
match '(/name/:name)(/height/:height)(/weight/:weight)' => 'people#index'
在新的路由系统中,这似乎是一个非常重要的疏忽。
可能有办法通过机架中间件破解它(可能会覆盖Rack :: URLMap),但这有点超出了我的联盟。