翻譯自:https://www.rubyguides.com/2020/01/rails-helpers/api
在 Rails 中,Helper 是指什麼?ruby
Helper 是一個函數(多數時候),用於 Rails 視圖之間,共享可複用的代碼。Rails 內置一組 Helper 函數。app
其中一個是 time_ago_in_words
。less
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"
這個函數,用於顯示指定格式的日期。ide
另外一個用於 Rails 視圖的 Helper 函數是 number_to_human
。函數
number_to_human(10_000) # "10 Thousand"
當你想要將數字顯示爲可讀的形式時,這個函數頗有用。學習
你能夠在 Rails 文檔中,找到更多的內容:https://api.rubyonrails.org/ui
那麼,該如何定義本身的 Helper 函數呢?this
若是你要編寫 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 函數,在你的視圖中。
像這樣:
<%= format_name(@user) %>
很簡單,對吧?
若是你想在視圖之外的地方使用這些 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 終端(加載了 Rails app 環境的 irb) 來使用函數和其餘一些東西。
你能夠在終端中使用 helpers,經過 helper.method_name
。
注意 helper
的單數形式,不然會收到錯誤消息。另外,記住終端下,當你修改了代碼後,它不會從新加載。
那麼,什麼時候建立 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 函數啦。
感謝閱讀。