翻譯自:https://www.rubyguides.com/2020/01/rails-helpers/
在 Rails 中,Helper 是指什麼?
Helper 是一個函式(多數時候),用於 Rails 檢視之間,共享可複用的程式碼。Rails 內建一組 Helper 函式。
其中一個是 time_ago_in_words
。
例子
time_ago_in_words(Time.now)
# "less than a minute"
time_ago_in_words(Time.now + 60)
# "1 minute"
time_ago_in_words(Time.now + 600)
# "10 minutes"
這個函式,用於顯示指定格式的日期。
另一個用於 Rails 檢視的 Helper 函式是 number_to_human
。
例子:
number_to_human(10_000)
# "10 Thousand"
當你想要將數字顯示為可讀的形式時,這個函式很有用。
你可以在 Rails 文件中,找到更多的內容:https://api.rubyonrails.org/
那麼,該如何定義自己的 Helper 函式呢?
編寫自己的 Helper 函式
如果你要編寫 Helper 函式,正確的路徑是 app/helpers
,然後將你的 Helper 函式,寫在其中的 helper module
中。
每個 Rails 應用,預設都帶了基礎的 helper module
,命名為 ApplicationHelper
。這裡就是存放你 helper 函式的地方。
只要在模組中寫好 helper 函式,那些函式在檢視中,將自動變的可用。稍後將為你展示如何在 Controller 中使用它們,以及為什麼這是個壞點子。如果你願意,你可以在 ApplicationHelper
中寫一切 helper 函式,但還有更好的組織方法。你可以建立一個你自己的檔案,用來儲存相關 helper 函式。
步驟
- 在
app/helpers
中,建立新檔案 - 命名為
user_helper.rb
- 新增同名新的模組
示例
# app/helpers/user_helper.rb
module UserHelper
def format_name(user)
if user.gender == "M"
"Mr. #{user.name}"
else
"Ms. #{user.name}"
end
end
end
這段程式碼可以被用於需要根據姓名來格式化使用者姓名的地方。
這樣做的好處?
當你需要使用這段邏輯的時候,你不需要在每次用到的時候,都重複。此外,當你需要修改這段邏輯的時候,你也只需要修改一次。
這很好。
使用你的新 Helper 模組
你可以使用你剛定義的 Helper 函式,在你的檢視中。
像這樣:
<%= format_name(@user) %>
很簡單,對吧?
如果你想在檢視以外的地方使用這些 Helper 函式,還有些工作要做。
如何在 Controller 中使用 Helper 函式
在控制器中,使用 Helper 函式,是可以實現的,只是這種用法不太常見。
在 Rails 5 之前,你必須引入 Helper 模組。
在 Rails 5 之後的版本,你可以通過呼叫在 Controller 中,呼叫 helpers
(注意複數形式)物件來使用。
像這樣:
class UsersController
def index
helpers.time_ago_in_words(Time.now)
end
end
你可以通過這種方式,在 Controller 中來使用 Helper 函式,不過你要仔細想清楚是否要這麼做,有這種需求可能是設計有問題。
考慮使用一個普通的 Ruby 物件代替。
在 Rails Console 中,使用 Helper 函式
我喜歡使用 Rails 終端(載入了 Rails app 環境的 irb) 來使用函式和其他一些東西。
而 Helper 物件被引入了!
你可以在終端中使用 helpers,通過 helper.method_name
。
注意 helper
的單數形式,否則會收到錯誤訊息。另外,記住終端下,當你修改了程式碼後,它不會重新載入。
編寫 Rails 檢視函式的最佳實踐
那麼,何時建立 Helper 函式呢?
在你需要在 HTML 中,使用一些包含邏輯的時候。
通常,這種情況下,可以分為兩類需求,一類是字串處理,一類是根據條件生成頁面元素。
其他建議
如果你像寫出符合最佳實踐的幫助函式,那你不應該使用例項變數
,例項變數也許對你某一個檢視有用,但有可能另一個檢視用不到。
這時,就會因為缺少變數,而返回錯誤資訊。
解決方案
將需要的用到的外部變數,通過引數進行傳遞,這樣會讓你的 Helper 函式清晰而明確
。
# wrong way
def eat_healthy
@fruit.eat
end
# do this instead
def eat_healthy(fruit)
fruit.eat
end
我最後的建議是,將你的 Helper 函式,根據不同功能,放在不同的模組檔案中。然後給這些模組起一個有描述性的名稱,這樣就使相關程式碼一目瞭然。
然而……
編寫 Helper 函式的時候,要注意函式名唯一,避免重名,否則會報衝突的錯誤。
另一個選擇是,使用
另一個選擇是,使用 presenter objects, 這裡進行演示。
總結
在本文中,你學習了有關 Rails Helper 函式的一些知識。Helper 函式是一組函式的集合,在檢視中進行呼叫。用於處理在諸如格式化文字、抽象複雜展示邏輯這類問題。
現在,是時候編寫你自己的 Helper 函式啦。
感謝閱讀。