回到CandidatesController
裡面,來新增show action
。至於要放在哪個地方都可以,只要不要放到private method
下面就行。
這邊我們就把show action
新增在index action
的下面。
存檔完,回到瀏覽器點擊任何一位候選人,看看頁面會出現什麼訊息。沒意外的話,應該會看到沒有樣板(no template)的訊息。果真出現了!!!
所以這個時候,我們就來做一個 show 的頁面給它。進入到view/candidates/
新增檔案show.html.erb
我們測試一下,點擊第一個(id=1)候選人’ccc’,看看會呈現什麼樣的畫面。
從上面的圖片可以看見,我們在show.html.erb
檔案新增的<h1>Candidate Information</h1>
有確實的顯示在瀏覽器頁面,且觀察網址列可以確定現在是在id是一號
的候選人的頁面了。
回到CandidatesController
的show action
這裡,它應該要做的事情,就是把某一個候選人的資料調出來。但是它要怎麼去調呢?
- 根據
id
去把對應的候選人資料調出來。
我們切換到終端機,來看看rails server
再跑的時候顯示的一些資訊,可以看到有一包Parameters: {"id"=>"1"}
。
表示點擊候選人之後,會有一個對應的id
被捕捉到Parameters
這個變數裡面。
所以我們得知可以透過params
裡面id
這個值拿回來用,把這個值放到show action
裡面。
假設今天我們要拿2號候選人的資料,這個時候我們就試著請Candidate
Model 去抓2號候選人的資料。
這邊就可以使用find_by(key: value)的方法去抓我們要的id的資料。
這時候給它一個變數來承接它@candidate = Candidate.find_by(id: params[:id])
。至於為什麼要給它一個變數,是因為等下在view的部分會使用到。
此時我們進到view/show.html.erb
來把<h1>
標籤更改為<h1><%= @candidate.name %></h1>
,表示我們要印出候選人的名稱。
打開瀏覽器看看畫面,真的有印出每個id
對應的候選人名稱。
既然如此,我們也可以印出其他的欄位資料,包含政黨、年紀、政見等等。
這邊我們用<ul><li></li></ul>
的方式呈現這些欄位資料。
那接著就可以打開瀏覽器來驗證一下,是否會出現一個列表有我們要的欄位資料。
在瀏覽器執行重新整理後,果真畫面上出現了我們想看到的列表清單。
上圖顯示的欄位資料也確實是我們想要抓到的資料。
可是呢?我們今天也要考慮了其他的情況,假設今天使用者在網址列需要輸入id
的位置,不小心打錯打成100,這時候會看到錯誤訊息

說 nil 找不到 ‘name’ 這個方法,為什麼會有 nil 呢?這個 nil 表示id=100這件事情是不存在的,所以得到一個nil回傳值。因此,我們可以回到show.html.erb
檔案裡面,增加一個if...else...
的判斷式。
>因為在Ruby的世界,只有兩個東西會是false
1. false 本身 ==> false
2. nil ==> false
所以我們可以使用這樣的寫法
如果 @candidate
是有東西,就執行下面第2-8行code
其他的話就在畫面上印出No Record found!!!
重新整理瀏覽器頁面,一樣是讓網址列的 id 輸入 100,這時候顯示的就不是錯誤訊息的畫面,而是No Record found!!!
。
目前這樣我們的 show action & show.html.erb算是完成了
這時候發現前面新增候選人的頁面忘記加上CSS強化視覺效果,所以下一堂課,來做畫面的CSS吧
參考來源:為你自己學 Ruby on Rails (https://railsbook.tw/)