0%

Ruby on Rails 網站開發 練習 - 016 ( 整理code )

練習 - 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/)