如何在Rails中做静态内容?

看不同的select:

一个是将静态页面放在公共/文件夹中,但我确实希望布局/应用程序的头部保持一致。

我试过这个,但是我得到一个错误:

# in routes.rb: map.connect '*path', :controller => 'content', :action => 'show' # in content_controller.rb: def show render :action => params[:path].join('/') end 

所有我想要的是一个简单的方法,把我的常见问题解答,联系人,tos,隐私和其他非应用程序types的页面放在一起很容易,只需创build一个.rhtml。 谁做了这个?

thinkbot有一个名为high_voltage的插件来显示静态内容: https : //github.com/thoughtbot/high_voltage

对于Rails5Rails4,您可以执行以下操作:

将下面的行放在routes.rb的末尾

  get ':action' => 'static#:action' 

然后请求root / welcome ,将呈现/app/views/static/welcome.html.erb

不要忘了创build一个“静态”控制器,即使你不需要在那里放置任何东西。

对于Rails3,你必须使用'match'而不是'get'

  match ':action' => 'static#:action' 

取决于url结构,如果你想让path脱离/(eg / about_us),那么:

 map.connect ':action', :controller => "static" 

这应该在你的路线文件的最后,把你的.html.erb文件放到app / views / static中,你就完成了。

例如:抛出about_us.html.erb ,会在/ about_us给你一个页面。

你在你的问题中的项目是伟大的捕获所有路线,你可以在params[:path]分析给你的数组。 有关更多的信息在http://railscasts.com/episodes/46-catch-all-route

渲染一个动作没有意义。 您将需要使用布局呈现模板(或文件)。

 # Path relative to app/views with controller's layout render :template => params[:path] # ... OR # Absolute path. You need to be explicit about rendering with a layout render :file => params[:path], :layout => true 

您可以使用页面caching从单个操作提供各种不同的模板。

 # app/controllers/static_controller.rb class StaticController < ApplicationController layout 'static' caches_page :show def show valid = %w(static1 static2 static3) if valid.include?(params[:path]) render :template => File.join('static', params[:path]) else render :file => File.join(Rails.root, 'public', '404.html'), :status => 404 end end end 

最后,我们需要定义一个路线。

 # config/routes.rb map.connect 'static/:path', :controller => 'static', :action => 'show' 

尝试访问这些静态页面。 如果path不包含有效的模板,我们将呈现404文件并返回404状态。

  • http://localhost:3000/static/static1
  • http://localhost:3000/static/static3
  • http://localhost:3000/static/static2

如果你看看app / public,你会注意到一个静态/目录static1.html,static2.html和static3.html。 在第一次访问页面之后,由于页面caching,任何后续的请求都将完全是静态的。

考虑如果你有一个家庭控制器夫妇方法如show,aboutus,privacy:

 class HomesController < ApplicationController def show end def privacy end def aboutus end end 

并将show方法映射到您的根,并将其他映射到一些命名的路由,如

 map.root :controller => "homes", :action => "show" map.aboutus "/aboutus", :controller => "homes", :action => "aboutus" map.privacy "/privacy", :controller => "homes", :action => "privacy" 

并与每个视图

 app/views/homes/aboutus.html.erb --> you get http://localhost:3000/aboutus app/views/homes/show.html.erb --> you get http://localhost:3000 (root) app/views/homes/privacy.html.erb --> you get http://localhost:3000/privacy 

所有在app / views / layout / application.html.erb使用相同的布局

Lindsaar解决scheme是我见过的最好的解决scheme之一。 他构build了一个caching的静态页面,当git修订版本发生变化时,这个页面就会过期

 <%= cache "site-page-#{@page_name}-#{App.git_revision}" do %> <%= render :partial => @page_name %> <% end %> 

为您的静态页面(例如联系人)创build一个PagesController并插入

 def contact_page end 

在config / routes.rb中插入

 get 'contact' => 'pages#contact_page' 

这将显示来自views / pages / contact_page.html.erb的内容