0%

Ruby on Rails 網站開發 練習 - 013 ( 投票 )

練習 - 013 (投票)

在候選人表單增加 vote 超連結。
我們想在Name的前面加上Vote的超連結


為了要服符合 RESTful 設計風格,路徑我們希望是candidates/id/vote
所以這時候要進到config/routes.rb 手動增加路徑,而我們選擇使用的方法是POST。意思就是對candidates/:id/vote這個地方做POST這個動作,它就會去找candidates#vote這個方法。
所以只要路徑對了,就會對到對的action
圖


這時候我們可以打開Routes路徑對照表來看看 rails routes。確實我們可以看到路徑有出來了。
圖


但是,如果今天我們是要幫原本的resources產生的8條路徑做擴充,那我們就必須改成另外的寫法。就是在原本的resources後面給它一個block(增加do/end)。
1
2
3
4
5
resources :candidates do
# 用 member
# 或是
# 用 collection
end

圖
* member: 原本8個路徑在多一個「成員」的路徑。candidates/:id/vote
* collection: 原本8個路徑多一個「沒有成員」的路徑。candidates/vote

打開我們的Routes路徑對照表 rails routes 看看發什麼事。
圖

可以發現第一行是member做的路徑擴充,另外一行就是collection做的路徑擴充。

但是我們可以明顯發現兩者產生的路徑擴充有不同。

  • memeber 的路徑有保留idcandidates/:id/vote
  • collection 產生的路徑不會保留idcandidates/vote

另外這裡要「特別注意」的地方就是資料讀取方法,這邊使用 POST 會比較適合,是因為POST會帶token,相較於 GET 比較安全。這樣才有檢查機制。

GET比較容易被仿造,只要知道你的路徑,有心人士就可以一直灌票,相信這樣的結果應該不大家所樂見的。
圖


回到 view/candidates/index.html.erb 表單中我們把要走的路徑寫上去。
圖


打開我們的瀏覽器,這時發現畫面還是會有錯誤訊息,找不到vote action


既然沒有,那就自己動手做一個。到CandidatesController來定義vote action


打開瀏覽器,確認畫面


但是這時候如果一直按下vote我們的票數就會一直蕾加上去。所以等下要來修改投票的部分。


因為我們還沒新增vote actionCandidatesController裡面,所以要先確認一下在/db/schema.rb vote 的值
圖


接著再到CandidatesController新增vote action


另外還有一個比較優化一點的方法
圖

@candidate.increment(:votes)
效果等於@candidate.votes = @candidate.votes + 1
increment 是 rails 提供的方法

下一堂課,就要來增加一個表格專門,紀錄投票紀錄。並且讓那個表格跟候選人建立關聯

參考來源:為你自己學 Ruby on Rails (https://railsbook.tw/)