代码之家  ›  专栏  ›  技术社区  ›  codykrieger

Rails静态页面路由-有更好的方法吗?

  •  3
  • codykrieger  · 技术社区  · 14 年前

    澄清一下,情况如下:

    我正在构建一个非常简单的CMS,它将成为我计划在未来创建的几个应用程序的基础。我真的很想创建一个名为“About”的页面(基本上是静态的),并且能够在“/About”自动访问它,而不必修改routes.rb。

    match '/*slug', :to => 'pages#dynamic_page', 
                    :constraints => { :fullpath => /.+\.html/ }
    

    问题是,我真的很想在最后省略“.html”。不过,比起“/pages/about”这样的url,我更喜欢扩展名。有没有更好的方法来处理这个问题?当我移除约束时发生的问题是对不存在的项目的请求通过Rails路由器,这显然是不太理想的,因为这是额外的开销必须处理。

    有更好的办法吗?如果被请求的页面是静态页面,那么有没有办法完全避免路由器,这样我就可以消除通配符路由?

    谢谢!

    1 回复  |  直到 14 年前
        1
  •  2
  •   David Demaree    14 年前

    要在Rails路由器中解决这个问题,tou应该能够在routes.rb的最底部添加一个路由,如下所示:

    match '/:slug(.:format)', :to => 'pages#dynamic_page'
    

    圆括号将路由的:format参数标记为可选,so/about或/about.html应该可以工作。

    这应该是 使它不会干扰您的其他路由。

    如果你想避开Rails路由器,你有两个选择,两个都稍微高级一点。

    1. 在web服务器的配置中,添加一个将/将映射到其他URI的重写规则。

    2. 添加机架中间件或Rails metal来处理静态页面路由。这避免了通过整个Rails路由堆栈来运行这些请求,但是Rails 3路由器非常快,我不确定添加这么多的复杂性只是为了服务半静态页面是值得的。

    你也可以看看 High Voltage gem

    # High Voltage treats pages like a REST resource; the page's name is the ID 
    match '/:id(.:format)', :to => 'high_voltage/pages#show'