代码之家  ›  专栏  ›  技术社区  ›  JP Silvashy Gautam Rege

Rails中的静态页面?

  •  13
  • JP Silvashy Gautam Rege  · 技术社区  · 14 年前

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

    4 回复  |  直到 7 年前
        1
  •  5
  •   Community CDub    7 年前

    你可以采取多种方法(并非全部 好的 方法)。

    1 public 目录

    如果它真的是静态的,你可以把它放在 公众的 目录。事物在 公众的 目录将立即提供,而不需要经过Rails堆栈。

    优势:

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

    缺点:

    • 您将无法使用网站布局。或查看帮助者 link_to .
    • 而不是把你的观点放在一个地方( app/views )现在他们在两个地方( 应用程序/视图 公众的 )这可能会令人困惑。

    思想:我非常强烈地感觉到这里的劣势大于优势。如果你想以牺牲可读性和程序员的幸福感为代价来稍微提高速度,为什么首先要使用Rails呢?

    2位 应用程序/视图 直接从路由器渲染

    它是 possible 从路由器渲染视图。然而,这绝对不是铁路的方式。

    来自官员 RailsGuide on routing :

    1轨道路由器的用途

    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
    

    这里的优点是,您不需要通过创建新的控制器和文件夹来引入开销/膨胀。缺点是它不是铁轨。创建的每个控制器都继承自 应用程序控制器 . 应用程序控制器 通常用于存放要在所有其他控制器之间共享的功能。请参阅以下示例: 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 StaticController StaticPagesController

    Michael Hartl的Ruby on Rails教程 uses 静态页面控制器 . 我同意 source 我不喜欢这种方法,因为页面通常不是静态的。

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

    还要注意Hartl的 footnote :

    我们制作静态页面的方法可能是最简单的,但不是唯一的方法。最佳方法实际上取决于您的需求;如果您期望有大量静态页面,使用静态页面控制器可能会变得相当麻烦,但在我们的示例应用程序中,我们只需要少数。如果你确实需要很多静态页面,看看高电压宝石。

    5 PagesController

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

    6 UncategorizedPagesController

    我会给管制员打电话 未分类页面控制器 因为这正是它们的本质——未分类的页面。是的,打字和阅读有点麻烦。我更喜欢明晰而不是简洁的优势,但我能理解选择要更简洁并符合 页面控制器 或者别的什么。

    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 并链接到它们: <%= link_to 'About', page_path('about') %> .

        2
  •  12
  •   Jaime Bellmyer    14 年前

    这取决于它们是否真的是静态的。您始终可以将页面添加到 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
  •  4
  •   Pragnesh Vaghela    14 年前

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

        4
  •  1
  •   Jamie Wong    14 年前

    如果它们是100%静态的,就把它们推到公共场所。 例如,当您启动一个新的Rails项目时, index.html 在你的公众场合。

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