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

时间:2010-11-04 21:01:38

标签: ruby-on-rails content-management-system routing

澄清一下,情况如下:

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

我目前有一个像这样的通配符路径,效果很好:

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

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

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

谢谢!

1 个答案:

答案 0 :(得分:2)

要在Rails路由器中解决这个问题,tou应该只能在routes.rb的最底部添加一个看起来像这样的路径:

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

括号将路径的:format参数标记为可选,因此/ about或/about.html应该有效。

这需要在路径文件的底部,以便它不会干扰您的其他路线。

如果你想避开Rails路由器,你有两个选择,两者都更高级。

  1. 在您的网络服务器配置中,添加一个重写规则,映射/关于其他URI。

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

  3. 您可能还想查看High Voltage gem。它是一个Rails引擎,主要用于提供静态页面。默认情况下,它会为您提供/ pages / about样式的URL,但您可以将以下内容添加到路径中以使其更漂亮:

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