【发布时间】:2011-04-28 21:51:24
【问题描述】:
所以我想知道在 Rails 中做静态页面的最佳方法是什么,或者更确切地说是 Rails 3。我一直对此有点困惑,比如我是否应该创建一个控制器?
【问题讨论】:
标签: ruby-on-rails
所以我想知道在 Rails 中做静态页面的最佳方法是什么,或者更确切地说是 Rails 3。我一直对此有点困惑,比如我是否应该创建一个控制器?
【问题讨论】:
标签: ruby-on-rails
您可以采用多种方法(它们并不都是好的方法)。
public 目录如果它真的是静态的,你可以把它放在public 目录中。 public 目录中的内容将立即提供,无需通过 Rails 堆栈。
优点:
缺点:
link_to 等帮助程序。app/views),现在它们位于两个位置 (app/views 和 public)。这可能会令人困惑。想法:我非常强烈地认为这里的劣势超过了优势。如果您希望以牺牲可读性和程序员的快乐为代价来稍微提高速度,那么为什么首先要使用 Rails?
app/views 并直接从路由器渲染possible 从路由器渲染视图。但是,它绝对不是 Rails 方式。
1 Rails 路由器的用途
Rails 路由器识别 URL 并将它们分派给控制器的操作。
在架构上,将路由器直接映射到视图本身并没有什么问题。许多其他框架就是这样做的。但是,Rails 并没有这样做,并且偏离既定惯例可能会混淆其他开发人员。
我是否应该创建一个控制器?
除非您想采用上述方法之一 - 是的,您应该创建一个控制器。
然后问题就变成了给控制器起什么名字。这个答案概述了一些选项。我会在这里列出一些想法。我还将添加其他三个选项。
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 方式。您创建的每个控制器都继承自 ApplicationController。 ApplicationController 通常用于容纳您希望在所有其他控制器之间共享的功能。请参阅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
StaticController 或 StaticPagesController
Michael Hartl 的流行 Ruby on Rails 教程 uses 和 StaticPagesController。我同意 source 的观点,因为我不喜欢这种方法,因为页面通常不是静态的。
此外,还有可能造成混淆 - 为什么我们将其他静态视图放在单独的控制器中?不应该从StaticPagesController 呈现静态视图吗?我认为混淆的可能性不会太高,但还是想注意一下。
另请注意 Hartl 的footnote:
我们制作静态页面的方法可能是最简单的,但也不是唯一的方法。最佳方法实际上取决于您的需求;如果您期望大量的静态页面,使用静态页面控制器会变得相当麻烦,但在我们的示例应用程序中,我们只需要几个。如果您确实需要大量静态页面,请查看 high_voltage gem。 ↑
PagesController
官方的 Ruby on Rails routing guide 使用 PagesController。我认为这种方法很好,但它根本不是描述性的。一切都是一页。这些页面与其他页面的区别是什么?
UncategorizedPagesController
我会调用控制器UncategorizedPagesController,因为这正是它们的本质 - 未分类的页面。是的,打字和阅读有点麻烦。我更喜欢清晰而不是简洁的优势,但我可以理解选择更简洁并使用PagesController 或其他内容。
使用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') %>。
【讨论】:
这取决于它们是否真的是静态的。您可以随时将页面添加到应用程序的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
请注意,如果您有动态页面元素,例如根据用户是否登录而更改的链接列表,则页面缓存对您不起作用。但是这些信息应该可以让您找到正确的方向。
【讨论】:
我更喜欢创建一个控制器。静态页面上的好教程和解释: http://railstutorial.org/chapters/static-pages#top
【讨论】:
如果它们是 100% 静态的,只需将它们推向公众即可。
例如,当您启动一个新的 Rails 项目时,您的公众号中有一个 index.html。
如果您想要更好的路由,那么是的,创建控制器可能不是一个坏主意。
【讨论】: