为了澄清,情况如下:
我正在构建一个非常简单的 CMS,它将成为我计划在未来创建的多个应用程序的基础。我真的希望能够创建一个名为“About”的页面(大部分是静态的),并自动能够通过“/about”访问它,而无需修改routes.rb。
我目前有一个像这样的通配符路由,效果很好:
match '/*slug', :to => 'pages#dynamic_page',
:constraints => { :fullpath => /.+\.html/ }
问题是,我真的希望能够省略末尾的“.html”。但是,与“/pages/about”之类的 url 相比,我更喜欢扩展名。有更好的方法来处理这个问题吗?当我删除约束时出现的问题是,对不存在的项目的请求会通过 Rails 路由器,这显然不太理想,因为这是必须处理的额外开销。
还有更好的办法吗?如果请求的页面是静态页面,是否有某种方法可以完全避免路由器,这样我就可以消除通配符路由?
谢谢!
最佳答案
要在 Rails 路由器中解决此问题,您应该能够将一条路由添加到 paths.rb 的最底部,如下所示:
match '/:slug(.:format)', :to => 'pages#dynamic_page'
括号将路由的 :format 参数标记为可选,因此/about 或/about.html 应该有效。
这需要位于路由文件的底部,这样就不会干扰您的其他路由。
如果您想避免使用 Rails 路由器,您有两个选择,两者都更高级一些。
在网络服务器的配置中,添加一条将/about 映射到其他 URI 的重写规则。
添加 Rack 中间件或 Rails 金属来处理静态页面路由。这避免了通过整个 Rails 路由堆栈运行这些请求,但 Rails 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'
关于ruby-on-rails - Rails 静态页面路由 - 有更好的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4101350/