【问题标题】:Specifying Entire Path As Optional Rails 3.0.0将整个路径指定为可选 Rails 3.0.0
【发布时间】:2010-06-11 20:58:03
【问题描述】:

我想创建一个带有完全可选参数的 Rails 3 路由。断路的例子是:

match '(/name/:name)(/height/:height)(/weight/:weight)' => 'people#index'

这会导致 'rake:routes' 产生:

/(/name/:name)(/height/:height)(/weight/:weight)

因此为所有链接添加一个初始斜线:

<a href="//name/kevin">...</a>

如果我将路线指定为:

match '/people(/name/:name)(/height/:height)(/weight/:weight)' => 'people#index'

但我想将此作为根 URL(与第一个示例一样,它不起作用)。谢谢。

【问题讨论】:

  • 对不起,删除了我的答案。诚然,我还是 Rails 3 路线的新手,但你让我难过。
  • 不用担心。它看起来像是一个解决方案:)。我仍然对解决方案感到困惑,但感谢您的潜在答案!
  • 你能给我们举几个例子,说明你想看到的路由类型以及它们指向的控制器吗?

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


【解决方案1】:

我不知道这是否可以使用 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'

它会起作用的。

【讨论】:

  • 谢谢安迪。这就是我需要的!我非常感谢帮助。只是很棒的答案。
【解决方案2】:

如果您使用单独的根映射,它是否有效?

root :to => 'people#index'
match '(/name/:name)(/height/:height)(/weight/:weight)' => 'people#index'

这似乎是新路由系统中的一个重大疏忽。

可能有一种方法可以通过机架中间件(可能覆盖 Rack::URLMap)来破解它,但这有点超出我的范围。

【讨论】:

  • 不,它不起作用。运行 rake:routes 返回 "/(/name/:name)(/height/:height)(/weight/:weight)" 并且初始斜线导致链接为 " ...“。
猜你喜欢
  • 2021-07-06
  • 1970-01-01
  • 2013-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-18
相关资源
最近更新 更多