Rails中的静态页面?

JP *_*shy 14 ruby-on-rails

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

Jai*_*yer 12

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

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

rails g controller site home about_us location
Run Code Online (Sandbox Code Playgroud)

然后,您可以将特定于页面的内容放入其中app/views/site/home.html.erb.

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

class SiteController < ApplicationController
  caches_page :home, :about_us, :location
end
Run Code Online (Sandbox Code Playgroud)

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


Ada*_*ner 9

您可以采取多种方法(它们并非都是好的方法).

1 - public目录

如果它是真正的静态,你可以把它放在public目录中.在物联网public目录将立即提供服务,而无需通过Rails栈去.

好处:

  • 因为它不必浪费时间通过Rails堆栈,客户端将获得更快的响应.

缺点:

  • 您将无法使用您的网站布局.或者查看助手link_to.
  • 而不是你的观点在一个地方(app/views),现在他们在两个地方(app/views public).这可能令人困惑.

思考:我非常强烈地认为这些缺点超过了这里的优势.如果您希望以可读性和程序员的快乐为代价来提高速度,那么为什么首先使用Rails?

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

这是可能的,以使从路由器的观点.但是,它肯定不是The Rails Way.

路由官方RailsGuide:

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
Run Code Online (Sandbox Code Playgroud)

这里的优点是您不会通过创建新的控制器和文件夹来引入开销/膨胀.缺点是它不是The Rails Way.您创建的每个控制器都继承自ApplicationController.ApplicationController通常用于容纳您想要在所有其他控制器之间共享的功能.请参阅" 操作控制器概述导轨指南"中的此示例:

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
Run Code Online (Sandbox Code Playgroud)

4 - StaticControllerStaticPagesController

Michael Hartl受欢迎的Ruby on Rails Tutorial 使用了一个StaticPagesController.我同意我得到的来源,因为我不喜欢这种方法,因为页面通常不是静态的.

此外,存在混淆的可能性 - 为什么我们将其他静态视图放在单独的控制器中?不应该从StaticPagesController?呈现静态视图?我不认为混淆的可能性太高,但仍然想要注意它.

另请注意Hartl的脚注:

我们制作静态页面的方法可能是最简单的,但这不是唯一的方法.最佳方法真正取决于您的需求; 如果你期望大量的静态页面,使用静态页面控制器可能会非常麻烦,但在我们的示例应用程序中,我们只需要一些.如果您确实需要大量静态页面,请查看high_voltage gem.↑

5 - PagesController

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

6 - UncategorizedPagesController

我会打电话给控制器UncategorizedPagesController,因为这正是它们的原因 - 未分类的页面.是的,打字和阅读有点麻烦.我更喜欢清晰而不是简洁的优点,但我可以理解选择更简洁,更合适PagesController或其他.

7 - 高压宝石

使用高电压,您无需执行写出路由和空控制器操作的繁琐工作:

# 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
Run Code Online (Sandbox Code Playgroud)

您只需将页面添加到app/views/pages并链接到它们:<%= link_to 'About', page_path('about') %>.

  • 哇,这是一个很好的答案!将其更新为最佳答案。 (2认同)