Rails中的静态页面?

时间:2010-10-21 23:17:45

标签: ruby-on-rails

所以我想知道在Rails中使用静态页面的最佳方法是什么,或者更确切地说是Rails 3.我总是对此有点困惑,就像我应该创建一个控制器一样?

4 个答案:

答案 0 :(得分:12)

这取决于它们是否真的是静态的。您始终可以将页面添加到应用的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

请注意,如果您有动态页面元素,例如根据用户是否已登录而更改的链接列表,则页面缓存不适合您。但是这些信息可以让你指出正确的方向。

答案 1 :(得分:6)

您可以采取多种方法(他们并非所有良好的方法)。

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

这里的优势在于您不会通过创建新的控制器和文件夹来引入开销/膨胀。缺点是它不是The Rails Way。您创建的每个控制器都继承自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教程uses a StaticPagesController。我同意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并链接到他们:<%= link_to 'About', page_path('about') %>

答案 2 :(得分:4)

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

答案 3 :(得分:1)

如果它们是100%静态的,那就把它们推向公众面前。 例如,当你启动一个新的rails项目时,你的公共场所会有一个index.html

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