如何在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
对于Rails5和Rails4,您可以执行以下操作:
将下面的行放在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的内容