将整个路径指定为可选Rails 3.0.0

时间:2010-06-11 20:58:04

标签: ruby-on-rails ruby-on-rails-3

我想创建一个带有完全可选参数的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(与第一个示例一样,不起作用)。感谢。

2 个答案:

答案 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),但这有点超出了我的联盟。