練習 - 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
1 | resources :candidates do |
打開我們的Routes
路徑對照表 rails routes
看看發什麼事。
可以發現第一行是member
做的路徑擴充,另外一行就是collection
做的路徑擴充。
但是我們可以明顯發現兩者產生的路徑擴充有不同。
memeber
的路徑有保留id
:candidates/:id/vote
collection
產生的路徑不會保留id
:candidates/vote
另外這裡要「特別注意」的地方就是資料讀取方法,這邊使用 POST
會比較適合,是因為POST
會帶token
,相較於 GET 比較安全。這樣才有檢查機制。
GET
比較容易被仿造,只要知道你的路徑,有心人士就可以一直灌票,相信這樣的結果應該不大家所樂見的。
回到 view/candidates/index.html.erb
表單中我們把要走的路徑寫上去。
打開我們的瀏覽器,這時發現畫面還是會有錯誤訊息,找不到vote action
既然沒有,那就自己動手做一個。到CandidatesController
來定義vote action
打開瀏覽器,確認畫面
但是這時候如果一直按下vote
我們的票數就會一直蕾加上去。所以等下要來修改投票的部分。
因為我們還沒新增vote action
在CandidatesController
裡面,所以要先確認一下在/db/schema.rb
vote
的值
接著再到CandidatesController
新增vote action
另外還有一個比較優化一點的方法
@candidate.increment(:votes)
效果等於@candidate.votes = @candidate.votes + 1
increment 是 rails 提供的方法
下一堂課,就要來增加一個表格專門,紀錄投票紀錄。並且讓那個表格跟候選人建立關聯
參考來源:為你自己學 Ruby on Rails (https://railsbook.tw/)