練習 - 016 (整理code)
首先,整理 candidate_controller.rb
@candidate = Candidate.find_by(id: params[:id])
它出現5次,所以我們可以拉到下面 private function 將它獨立出來成為一個 function。
其他 function 有使用到它的
都可以用呼叫的方式
目前這樣有變得比較簡潔乾淨,但是find_candidate 都還是會被重複呼叫5次。
這裡就要介紹Rails Controller提供了一個更便利有趣的方法:before_action :find_candidate
會發現原本需要輸入的地方都可以拿掉function
另外它還有很好的地方就是可以指定需要使用到find_candidate 的 function,可以改寫成
這樣就可以指定哪些方法使用 find_candidate。
也有另外一種反向的寫法
另外flash[:notice] = 'Candidate Created!!!'
也可以跟另外一行redirect_to '/candidate'
寫在同一行
其他的方法有用到 notice
也都可以同樣簡化成一行。
接著要看 view
的地方,有那裡可以做精簡化。
一樣我們先從一些會被重複使用的方法來做簡化,我們可從view/layouts
裡面的application.html.erb
也就是所謂的「公版」裡面來進行相關的設定,達到我們要的簡化效果。所以我們可以把 index.html.erb
裡面的 <%= flash[notice] %>
放到 application.html.erb
的<body> </bodya
裡面
另外在 new.html.erb
的新增候選人及 edit.html.erb
更新候選人寫法幾乎一樣
那我們可以另外開一個新的檔案命名 _form.html.erb
,把它變成「局部選染」檔案獨立出來,規定局部渲染檔案命名前面是下底線_
。
然後回到 new.html.erb
裡面輸入
這樣畫面就會乾淨很多。所以 edit.html.er
檔案也可以同樣寫法
同時我們檢查 _form.html.erb
檔案中有沒有可以簡化的地方,發現檔案中的 @candidate 變數是 _form.html.erb
他要自己伸手要東西過來,不是等別人餵東西給他。所以我們可以new.html.erb
裡面再加工一下。
這樣我們就可以把_form.html.erb
裡面的實體變數 @candidate
改成區域變數 candidate
。同樣的 edit.html.erb
也要做一樣的修改。
參考來源:為你自己學 Ruby on Rails (https://railsbook.tw/)