2009-07-18 129 views
71

看看不同的選項:如何在Rails中做靜態內容?

一個是隻是把靜態網頁放在公共/文件夾,但我確實希望從佈局/應用程序的頭是一致的。

我想這一點,但我得到了一個錯誤:

# in routes.rb: 
map.connect '*path', :controller => 'content', :action => 'show' 

# in content_controller.rb: 
def show 
    render :action => params[:path].join('/') 
end 

所有我想要的是一種簡單的方法來的地方放在一起就像我的常見問題解答,聯繫方式,服務條款,隱私,以及其他非應用型的網頁的東西只需創建一個.rhtml即可。誰做到了這一點?

回答

30

thoughtbot上提供更多的信息有一個名爲high_voltage用於顯示靜態內容插件:https://github.com/thoughtbot/high_voltage

+4

斷開鏈接:使用:http://github.com/thoughtbot/high_voltage – Jonathan 2010-10-14 14:16:04

+0

只需將其添加到一個項目中,它的效果非常好! – Abel 2010-10-18 07:04:19

13

呈現動作沒有意義。您將需要使用佈局呈現模板(或文件)。

# 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 

您可以使用頁面緩存從單個動作提供各種不同的模板。

# 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' 

嘗試訪問這些靜態頁面。如果路徑不包含有效的模板,我們將呈現404文件並返回404狀態。

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

如果你把在app /公開一看,你會發現有static1.html,static2.html和static3.html靜態/目錄。首次訪問該頁面後,由於頁面緩存,任何後續請求都將完全爲靜態。

+0

正是我需要的,謝謝! – bluediapente 2012-02-08 16:54:02

2

考慮如果u有喜歡錶演,關於我們,隱私夫婦方法1個家庭控制器:

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 

所有使用在應用程序/視圖中的相同的佈局/layout/application.html.erb

22

取決於網址結構,如果您希望路徑脫離/(例如,/about_us),則:

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

這應該在你的路由文件的最後,要把你的.html.erb文件到應用程序/視圖/靜態和你做。

例如:扔在about_us.html.erb,會給你一個頁面在/ about_us。

你在你的問題中的項目是一個很好的捕獲所有路線,你可以在params[:path]分析給你的數組。在http://railscasts.com/episodes/46-catch-all-route

178

對於Rails5Rails4,你可以做到以下幾點:

把線下在你的routes.rb

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

然後請求root/welcom e,將呈現/app/views/static/welcome.html.erb

不要忘記創建一個'靜態'控制器,即使你不需要在那裏放置任何東西。

對於Rails3中你必須使用的,而不是「得到」

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

+1真棒,正是我所需要的。這應該得到更多的選票,因爲它是最新的Rails。 – spong 2011-08-19 01:45:47

+14

如果有人想知道,這裏的「:行動」是魔法;如果你把它稱爲「:id」或「:title」或其他什麼,它將不起作用。 – mahemoff 2011-12-26 21:41:18

+1

在Rails4中,我在開發模式中收到一條警告,聲稱用「get」替換「match」。 – joseph 2013-03-13 20:34:42

2

Lindsaar解決方案「匹配」是我見過的最好的一個。他構建了一個緩存的靜態頁面,當git修訂版發生更改時,該靜態頁面會過期

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

創建你的靜態頁面PagesController(如觸點),並插入

def contact_page 
end 

在配置/ routes.rb中插入

get 'contact' => 'pages#contact_page' 

這將顯示來自視圖/網頁內容/contact_page.html.erb

+0

爲什麼downvote?我很欣賞我的回答與Rails 4有關,但仍然會回答某些問題。 – GoodViber 2015-07-23 10:50:16

相關問題