【问题标题】:Static pages in Rails?Rails 中的静态页面?
【发布时间】:2011-04-28 21:51:24
【问题描述】:

所以我想知道在 Rails 中做静态页面的最佳方法是什么,或者更确切地说是 Rails 3。我一直对此有点困惑,比如我是否应该创建一个控制器?

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    您可以采用多种方法(它们并不都是好的方法)。

    1 - public 目录

    如果它真的是静态的,你可以把它放在public 目录中。 public 目录中的内容将立即提供,无需通过 Rails 堆栈。

    优点:

    • 因为不必浪费时间通过 Rails 堆栈,客户端将收到更快的响应。

    缺点:

    • 您将无法使用您的网站布局。或查看 link_to 等帮助程序。
    • 您的视图不再位于一个位置 (app/views),现在它们位于两个位置 (app/views public)。这可能会令人困惑。

    想法:我非常强烈地认为这里的劣势超过了优势。如果您希望以牺牲可读性和程序员的快乐为代价来稍微提高速度,那么为什么首先要使用 Rails?

    2 - 放入app/views 并直接从路由器渲染

    possible 从路由器渲染视图。但是,它绝对不是 Rails 方式。

    来自官方RailsGuide on routing

    1 Rails 路由器的用途

    Rails 路由器识别 URL 并将它们分派给控制器的操作。

    在架构上,将路由器直接映射到视图本身并没有什么问题。许多其他框架就是这样做的。但是,Rails 并没有这样做,并且偏离既定惯例可能会混淆其他开发人员。


    我是否应该创建一个控制器?

    除非您想采用上述方法之一 - 是的,您应该创建一个控制器。

    然后问题就变成了给控制器起什么名字。这个答案概述了一些选项。我会在这里列出一些想法。我还将添加其他三个选项。


    3 - 使用ApplicationController

    # routes.rb
    get "/about" to: "application#about"
    
    # application_controller.rb
    class ApplicationController < ActionController::Base
      def about
        render "/about"
      end
    end
    
    # app/views/about.html.erb
    

    这里的优点是您不会通过创建新的控制器和文件夹来引入开销/膨胀。缺点是它不是 Rails 方式。您创建的每个控制器都继承自 ApplicationControllerApplicationController 通常用于容纳您希望在所有其他控制器之间共享的功能。请参阅Action Controller Overview Rails Guide 中的此示例:

    class ApplicationController < ActionController::Base
      before_action :require_login
     
      private
     
      def require_login
        unless logged_in?
          flash[:error] = "You must be logged in to access this section"
          redirect_to new_login_url # halts request cycle
        end
      end
    end
    

    4 - StaticControllerStaticPagesController

    Michael Hartl 的流行 Ruby on Rails 教程 usesStaticPagesController。我同意 source 的观点,因为我不喜欢这种方法,因为页面通常不是静态的。

    此外,还有可能造成混淆 - 为什么我们将其他静态视图放在单独的控制器中?不应该从StaticPagesController 呈现静态视图吗?我认为混淆的可能性不会太高,但还是想注意一下。

    另请注意 Hartl 的footnote

    我们制作静态页面的方法可能是最简单的,但也不是唯一的方法。最佳方法实际上取决于您的需求;如果您期望大量的静态页面,使用静态页面控制器会变得相当麻烦,但在我们的示例应用程序中,我们只需要几个。如果您确实需要大量静态页面,请查看 high_voltage gem。 ↑

    5 - PagesController

    官方的 Ruby on Rails routing guide 使用 PagesController。我认为这种方法很好,但它根本不是描述性的。一切都是一页。这些页面与其他页面的区别是什么?

    6 - UncategorizedPagesController

    我会调用控制器UncategorizedPagesController,因为这正是它们的本质 - 未分类的页面。是的,打字和阅读有点麻烦。我更喜欢清晰而不是简洁的优势,但我可以理解选择更简洁并使用PagesController 或其他内容。

    7 - 高压宝石

    使用High Voltage,您不必再写出路由和清空控制器操作等繁琐的工作:

    # routes.rb
    root 'pages#home'
    get '/about', to: 'pages#about'
    get '/contact', to: 'pages#contact'
    get '/help', to: 'pages#help'
    get '/terms-of-service', to: 'pages#terms_of_service'
    get '/landing-page', to: 'pages#landing_page'
    ...
    
    # pages_controller.rb
    
    def PagesController < ApplicationController
      def home
      end
    
      def about
      end
    
      def contact
      end
    
      def help
      end
    
      def terms_of_service
      end
    
      def landing_page
      end
    
      ...
    end
    

    您只需将您的页面添加到app/views/pages 并链接到它们:&lt;%= link_to 'About', page_path('about') %&gt;

    【讨论】:

    • 哇,这是一个很好的答案!将此更新为最佳答案。
    • 谢谢,感谢您的称赞 :)
    【解决方案2】:

    这取决于它们是否真的是静态的。您可以随时将页面添加到应用程序的public/ 目录,它们会正常工作。它们甚至不会启动轨道或接触路由引擎。

    但是,网站上的大多数页面,包括静态页面,仍然需要使用网站的布局。您不想在几十个页面中分别更新布局。在这种情况下,您可以创建一个“catchall”控制器。这是一个例子:

    rails g controller site home about_us location
    

    然后,您可以将页面特定的内容放在app/views/site/home.html.erb 中,例如。

    更新:您可以更进一步,通过调用靠近控制器顶部的caches_page 来缓存这些页面:

    class SiteController < ApplicationController
      caches_page :home, :about_us, :location
    end
    

    请注意,如果您有动态页面元素,例如根据用户是否登录而更改的链接列表,则页面缓存对您不起作用。但是这些信息应该可以让您找到正确的方向。

    【讨论】:

      【解决方案3】:

      我更喜欢创建一个控制器。静态页面上的好教程和解释: http://railstutorial.org/chapters/static-pages#top

      【讨论】:

        【解决方案4】:

        如果它们是 100% 静态的,只需将它们推向公众即可。 例如,当您启动一个新的 Rails 项目时,您的公众号中有一个 index.html

        如果您想要更好的路由,那么是的,创建控制器可能不是一个坏主意。

        【讨论】:

        • 我想我想利用 ERB,所以我可以保留我的布局等。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多