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

标签 ruby-on-rails content-management-system routes

为了澄清,情况如下:

我正在构建一个非常简单的 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 路由器,您有两个选择,两者都更高级一些。

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

  2. 添加 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/

相关文章:

ruby-on-rails - Rails 有类似 Django Rest Framework 的东西吗?

content-management-system - OCM 还是 JCR 中的节点?

php - 开发 Codeigniter 游戏

ruby-on-rails-3 - 在完整的 Rails 引擎中从 lib 文件夹加载路由

javascript - 如何保持rails和javascript路由之间的一致性?

regex - Symfony2 如何在路由正则表达式中允许带破折号的 slug?

ruby-on-rails - Nokogiri 无法安装 native 扩展问题

ruby-on-rails - 设计发送欢迎电子邮件

mysql - 带有远程数据库的 Rails 应用程序 - 我应该在应用程序中复制还是远程连接

c# - 开源 CMS(.Net 与 Java)