2016年3月15日 星期二

使用rails產生靜態網頁(二)

 在上一回中,我們產生了一頁靜態網頁,現在我們要繼續產生更多筆的靜態網頁。
我們產生一個靜態網頁常常產生的分頁:about page, contact page

首先是跟router說明在接收到不同網址的要求時,應該怎麼辦。在config/routes.rb 中加入兩行
  get "/pages/about" =>; "pages#about"
  get "/pages/contact" =>; "pages#contact"

意思是當 瀏 覽器輸入 localhost:3000/pages/about/ 以及localhost:3000/pages/contact/時會分別對應到 pages Controller底下的about, 以及 contact action

再來就是設定Controller, 以及 View這二位一體的部分了。
(原本是三位一體,但是靜態網頁沒有model的部份)


a)Controller
app/controllers/pages_controller.rb 加入contact, about action的定義
def contact
end
def about
end

b)View
app/views/pages/contact.html.erb 編輯contact 靜態網頁模板

<h1>contact</h1>

app/views/pages/about.html.erb 編輯about 靜態網頁模板

<h1>about</h1>


這樣我們就有多筆靜態網頁了!但是應該有更省力的方式…




當成功嘗試建立多筆網頁後,會開始發現每一次都要新增router規則, view, controller 是動作很多的一件事,也就是說當我們今天有100個靜態網頁時,我們就要在route新增100個對應表,controller也要定義100個action。這些動作是可以被套用規則的。我們開始觀察這些動作的規則,如果知道規則就可以利用自動化的概念來減少程式設計師的工作。自動化很重要的一點是我們先找到變數,然後讓rails對變數的輸入作出應變來減少程式碼。

在我們的說明範例中,不同的分頁名稱就是一個可以拿來利用的變數,因為使用者在瀏覽不同分頁時,每次有變化的是分頁名稱,而連帶的controller, view也要對應改變。因此我們在router地方巧妙的用變數來表示輸入的網址

我們修改一下config/routes.rb
  get "/pages/index" =>; "pages#show"
  get "/pages/about" =>; "pages#about"
  get "/pages/contact" =>; "pages#contact"

改為
  get "/pages/ :single_page" =>; "pages#show"

用single_page 這個變數來暫存輸入的網頁名稱。當這樣修改後,之後只要網址符合/pages/... 的規則,就會統一導向用pages Controller 底下的show action來處理。當瀏 覽器向router提出要求,則會將分頁名稱 存入params[:single_page]並在controller中被呼叫使用。因為網頁名稱已經存入了一個名稱變數,而show action的內容就是去render 指定名稱變數 (意即single_page) 的template

改寫Controller 中的show action
def show
      render template: "pages/#{params[:single_page]}
end

然後就大功告成了,我們只要輸入指定的網址,然後有與該網址對應的template檔案,這樣靜態網頁就可以成功被讀取了。


在這一節,我們知道怎麼建立多個網頁,並利用歸納規則、利用變數的技巧來幫助我們用少量的程式碼完成大量的工作。從此當我們新增一個網頁時,router不用動,controller也不用動,只要新增一個對應的template 就行了。只是讀者們可能要想到一個問題,我們能夠成功讀取檔案是因為我們知道什麼網址會有對應的template,但是今天一般使用者不知道這些,他可能自己在網址上隨意輸入一個名稱,比如http://localhost:3000/pages/abc,這在template中沒有該檔案,就會出現錯誤,為了能夠處理這樣的狀況,我們在下一回中要來加入能夠處理的機制。(註:沒錯,從controller下手就對了!)