[譯] 如何使用 Rails Helper

shiweifu發表於2020-07-01

翻譯自: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 函式啦。

感謝閱讀。

相關文章