【问题标题】:Rails static page routing - is there a better way?Rails 静态页面路由 - 有没有更好的方法?
【发布时间】:2010-11-04 21:01:37
【问题描述】:

为了澄清,情况如下:

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

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

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

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

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

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

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

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

    这需要位于路由文件的底部,以免干扰您的其他路由。

    如果您想避免使用 Rails 路由器,您有两个选择,都更高级一些。

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

    2. 添加 Rack 中间件或 Rails metal 来处理静态页面路由。这避免了通过整个 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'
    

    【讨论】:

    • 谢谢 - 但是,格式可选的问题是浏览器开始向 /favicon.ico 发出请求,这些请求通过我的 PagesController 中的 dynamic_page 方法。在所述方法中发生的第一件事是对数据库的访问,以查看是否有任何匹配的页面具有“favicon”或“favicon.ico”的 url slug - 我真的很想避免对数据库的访问。这就是为什么我现在有 .html 约束。
    • 你有静态的 favicon.ico 文件吗?不幸的是,浏览器会要求提供一个,我不想为了解决这个问题而构建一个疯狂复杂的解决方案,所以我只是在我的公共目录中放了一个空白的 favicon 文件并称之为完成。你甚至可以把它变成一个空的文本文件——浏览器会阻塞它,但它也会阻塞你的应用程序的 500 错误,这样就没有数据库命中。
    • 我没有,但我想如果需要我可以。我主要担心的是,每次出现 404 或路由错误时,它都会不必要地通过该路由。
    • 发生,但这并不是什么大不了的事。如果找不到动态页面数据库记录,Rails 无论如何都应该将其处理为 404(这是 ActiveRecord::RecordNotFound 的默认错误代码)。
    猜你喜欢
    • 1970-01-01
    • 2019-03-21
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    相关资源
    最近更新 更多