16
10

More than 3 years have passed since last update.

【Ruby on Rails】便利なヘルパーメソッド

Last updated at Posted at 2020-09-29

はじめに

ヘルパーメソッドについて、パーフェクト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) 全角の英文字を半角に変換するヘルパーメソッド

app/helper/application_helper.rb
module ApplicationHelper
  def to_hankaku(str)
    str.tr('A-Za-z', 'A-Za-z')
  end
end
to_hankaku('Ruby')
#=> Ruby

例2) ユーザーエージェントからアクセス元がiPhone/Androidか判定するメソッド

app/helper/application_helper.rb
module ApplicationHelper
    def iphone?
      request.user_agent.include?('iPhone')
    end

    def android?
      request.user_agent.include?('Android')
    end
end
sample.html.slim
  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に遷移させるボタンを切り替えられる。

参考

パーフェクトRuby on Rails 【増補改訂版】

16
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
10