はじめに
ヘルパーメソッドについて、パーフェクトRuby on Rails 【増補改訂版】を読んで個人的に学んだ内容をまとめます。
ヘルパーメソッドとは
ビューテンプレートで開発の手助けとなる便利なメソッド。HTML生成を行うものやURL生成するものなどがある。
パスとURLヘルパーメソッド
ルーティングを表示する際のPrefixの値+_path
でドメインやポートなどを除いた/
から始まるパスを、Prefixの値+_url
とするとドメインなども含んだ完全なURLを返す。
パスに「:id」といった変動する値がある場合、引数にハッシュ形式で値を指定する。
url_forやlink_to、redirect_toでパスやURLを指定する際に使う。
以下のルーティングの場合、次のようなパスやURLが返る。
ルーティング
users GET /users(.:format) users#index
user GET /users/:id(.:format) users#show
edit_user GET /users/:id/edit(.:format) users#edit
返るパスやURL
- users_path →
/users
- user_path(id: 1) →
/users/1
- edit_user_url(id: 1) →
http://www.example.com/users/1/edit
url_for
Webアプリケーションのパスを構築するためのヘルパーメソッド。文字列を直接書かずにルーティング上の定義を活用できる。
単にURLを取得したいときに使用する。
url_for(users_path)
#=> /users
link_to
link_toはaタグを生成するヘルパーメソッド。
_path
や_url
でルーティング上の定義を活用して、画面にリンクを設置したいときに使用する。
link_to('編集', edit_user_path(id: 1))
#=> <a href="/users/1/edit">編集</a>
time_ago_in_words
ある時刻と現在時間のあいだにどの程度空きがあるかを、人間にとってわかりやすく表示するヘルパーメソッド。
最終ログイン日時などを表示するサービスで活用できそう。
time_ago_in_words(Time.current)
#=> less than a minute
time_ago_in_words(Time.current + 3.days)
#=> 3 days
number_with_delimiter
長い数字をカンマ区切りするヘルパーメソッド。オプションで区切り文字を変更することもできる。
number_with_delimiter 1234567890
#=> 1,234,567,890
number_with_delimiter 1234567890, delimiter: '@'
#=> 1@234@567@890
その他にも様々なヘルパーメソッドがRailsには用意されているので、自分で実装する前にRailsガイドを参考にすると良さそう。
独自ヘルパーメソッド
Rails組み込みのヘルパーメソッドでは用途に合わない場合は自分でヘルパーメソッドを実装する。
ヘルパーメソッドを定義するためのモジュールは「app/helpers」というディレクトリの配下に定義する。
アプリケーション全体で使うものであれば「app/helpers/application_helper.rb」に、コントローラ毎に使うようなものであれば「app/helpers/users_helper.rb」のようにコントローラに対応するhelper用のファイルを用意する。
例1) 全角の英文字を半角に変換するヘルパーメソッド
module ApplicationHelper
def to_hankaku(str)
str.tr('A-Za-z', 'A-Za-z')
end
end
to_hankaku('Ruby')
#=> Ruby
例2) ユーザーエージェントからアクセス元がiPhone/Androidか判定するメソッド
module ApplicationHelper
def iphone?
request.user_agent.include?('iPhone')
end
def android?
request.user_agent.include?('Android')
end
end
p.button
- if iphone?
a href="https://itunes.apple.com/jp/app/(略)" target="_blank"
| App Storeでダウンロードする
- if android?
a href="https://play.google.com/store/apps/details?(略)" target="_blank"
| Google Playでダウンロードする
アクセス元のスマホの種類を判別して、App StoreまたはGoogle Playに遷移させるボタンを切り替えられる。