iT邦幫忙

2021 iThome 鐵人賽

DAY 26
0
自我挑戰組

Ruby on Rails JS系列 第 26

Ruby on Rails View Helper

除了上⾯提到的局部樣版,View Helper 也是⽤來整理程式碼很常⽤的⼿法。其實平
常⼤家在寫的 link_to 、 image_tag 或是 form_for ,它都是⼀種 View
Helper。
雖然 View Helper 通常是寫在 View 的 HTML 標籤裡,但其實 View Helper 本⾝是標
準的 Ruby 程式碼,使⽤起來就跟在呼叫⼀般的 Ruby ⽅法⼀樣。
⾃定 View Helper
除了 Rails 內建的⽅法,有時候在專案中也會寫⼀些⾃⼰會⽤的⽅法,例如可能有⼀
段程式碼長這樣:

<tr>
<td>
<% if gender == 1 %>
男
<% elsif gender == 0 %>
女
15 Layout,Render 與 View Helper
235
<% else %>
不想說
<% end %>
</td>
</tr>

當 gender 的值是 1 的時候印出 男 ,是 0 的時候就印出 女 ,不然就印出 不
想說 。雖然像這樣的寫法很簡單也很直覺,但這樣就會讓 View 開始有⼀些邏輯判
斷了,這不是好事。View 的主要⽤途是輸出結果在畫⾯上,所以邏輯判斷越少越
好。像上⾯這個例⼦,我們就可以把這段 if .. else .. 判斷,搬到 View
Helper 裡放著。
View Helper 主要是放在 app/helpers ⽬錄裡。要寫在哪個檔案裡都可以(因為
所有的 View Helper 都可以被 Rails 載入),但通常會放在跟功能有關的檔案裡。這
裡我就先把 Helper 寫在 app/helpers/application_helper.rb 裡⾯:

module ApplicationHelper
def user_gender(gender)
if gender == 1
"男"
elsif gender == 0
"女"
else
"不想說"
end
end
end

View Helper 是定義在 Ruby 的模組(Module)裡,Rails 在啟動的時候會把這些
View Helper 都載進來,讓⼤家在 View 可以直接使⽤。在上⾯這個例⼦,我在
ApplicationHelper 這個模組裡定義了⼀個 user_gender ⽅法,⽽且這個⽅法
會接收⼀個參數,並根據參數的內容回傳「男」、「女」或「不想說」。有這個
View Helper 之後,原來在 View 的那段 if ... else ... 的邏輯判斷就可以改
成這樣:

<tr>
<td><%= user_gender(gender) %></td>
</tr>

適時的使⽤ View Helper 把需要邏輯判斷的部份抽出來,可以讓 View 的程式碼變得
乾淨⼜清楚。
View Helper 的使⽤規則
雖然 View Helper 的⽅法寫在 app/helpers ⽬錄下的隨便哪個檔案都可以,但檔
名以及模組名稱是有規則的:

  1. 模組名稱需為 XXXXHelper ,例如 UserHelper 或是 PostHelper 。
  2. 若模組名稱是 UserHelper ,檔案名稱為 user_helper.rb ;如果是
    PostHelper ,檔名則為 post_helper.rb ,依此類推。
  3. 雖然 View Helper 的⽅法要寫在哪個 Helper 模組都可以,但模組會按照模組的
    名字的英⽂字⺟順序依序載入,例如 PostHelper 會比 UserHelper 先載
    入,也就是說如果這兩個模組上有名字⼀樣的⽅法,先載入⽅法的會被後載入
    的覆蓋掉,這點需要特別注意。

參考資料

[為你自己學Ruby on Rails]https://railsbook.tw/chapters/08-ruby-basic-4.html


上一篇
Ruby on Rails 局部渲染(Partial Render)
下一篇
Ruby on Rails Model 驗證及回呼
系列文
Ruby on Rails JS29

尚未有邦友留言

立即登入留言