Do a custom view helper

看到別人的部落格外觀,幾經考慮,最後決定從選單重做:原本垂直方向的選單浪費很多空間,看了別人的部落格以後,我決定改把選單放在頁頂。這樣就會多出更多空間。這次修改主要用到了 CSS 的 Flex 特性、還有把外部連結改為 Helper。Flex 比較麻煩,也許等到以後再說。這裡來講把外部連結改為 Helper 的事情。

原本在網頁的程式碼是這樣子的:

<%= link_to "https://example.com/abc" do %>
    <%= fa_icon "example" %>
<%= end %>
<%= link_to "https://qwertyui.com/abc" do %>
    <%= fa_icon "qwertyui" %>
<%= end %>
<%= link_to "https://omkinjub.com/abc" do %>
    <%= fa_icon "omkinjub" %>
<%= end %>

但是在網頁裝這麼多重複的 Helper 頗為惱人……一定有辦法完成吧?可是我不知道怎麼做。找了很久,才發現有人是這麼寫的

# app/helpers/posts_helper.rb
module PostsHelper
  def status_label status
    case status
    when 'submitted'
      content_tag(:span, status.titleize, class: 'label label-primary')
    when 'approved'
      content_tag(:span, status.titleize, class: 'label label-success')
    when 'rejected'
      content_tag(:span, status.titleize, class: 'label label-danger')
    end
  end
end

這個寫法…頗令我驚訝的。不過,我很快就試著做了自己的:

def links( input )
    account_name = "abc"
    website = "https://" + input + ".com/" + account_name

    link_to website, target: "_blank" do
        fa_icon input
    end
end

然後在頁面直接用 links( "example" ) 就能完成了。

但我很不明白的是:為什麼 helper 可以傳出我預期的 helper,也就是 link_to 而不是其他東西?我不明白為什麼,感覺頗為黑箱的。

參考資料

  1. Creating a Custom View Helper in Rails