[譯] 如何使用 Rails Helper

翻譯自:https://www.rubyguides.com/2020/01/rails-helpers/api

在 Rails 中,Helper 是指什麼?ruby

Helper 是一個函數(多數時候),用於 Rails 視圖之間,共享可複用的代碼。Rails 內置一組 Helper 函數。app

其中一個是 time_ago_in_wordsless

例子

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 函數

若是你要編寫 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 函數啦。

感謝閱讀。

相關文章
相關標籤/搜索