所以我想知道在Rails中使用静态页面的最佳方法是什么,或者更确切地说是Rails 3.我总是对此有点困惑,就像我应该创建一个控制器一样?
答案 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)
您可以采取多种方法(他们并非所有良好的方法)。
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
这里的优势在于您不会通过创建新的控制器和文件夹来引入开销/膨胀。缺点是它不是The Rails Way。您创建的每个控制器都继承自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 a 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') %>
。
答案 2 :(得分:4)
我更喜欢创建一个控制器。静态页面上的好教程和解释: http://railstutorial.org/chapters/static-pages#top
答案 3 :(得分:1)
如果它们是100%静态的,那就把它们推向公众面前。
例如,当你启动一个新的rails项目时,你的公共场所会有一个index.html
。
如果你想要更好的路由,那么,创建一个控制器可能不是一个坏主意。