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
而不是其他東西?我不明白為什麼,感覺頗為黑箱的。