[Rails] ヘルパーメソッドって素敵


書くこと

Railsのhelperディレクトリって、何のためにあるの?と言う疑問に答えます。

環境

Ruby 6.0.3.4
Ruby on Rails 2.6.5

結論

Ruby on Railsには、ヘルパーメソッドなるものが存在します。
そのヘルパーメソッドを、自作してerbファイルで用いることができるようにするためのディレクトリです。

ヘルパーメソッドとは?

まずは、ヘルパーメソッドとは何かということを先に述べていきたいと思います。

こちらの記事からの引用を用いて説明します。

ある動作を処理する場合にメソッド化して扱えるようにRailsにあらかじめ組み込まれた機能です。

Railsに標準搭載されているヘルパーメソッドには、

  • form_with
  • link_to
  • image_tag

などがあります。これらは以下の例のように、htmlの文法の中でrubyの文法が用いられるerb拡張子の中で利用されます。

index.html.erb
<%= form_with url: root_path do |f| %>
  <% f.label :name %>
  <% f.text_area :name %>
<% end %>

<%= link_to "トップページへ", root_path %>

このように、ヘルパーメソッドを用いる時は、<%%>のなかに記述することで、ヘルパーメソッドが利用できるようになります。

以上のコードは、以下のような形で、rubyのpost機能を持った状態で、以下のように表示されます。

ここまでで、ヘルパーメソッドが何かということは何となく理解してもらえたでしょうか。
それでは次に、本題であるRailsのディレクトリに存在するhelpersは何のためにあるのかということを、見ていきます。

ヘルパーメソッドは自作できる!

このタイトル通り、今まで見てきたヘルパーメソッドは自作することが可能です。
その自作したヘルパーメソッドを保存するファイルをまとめているのが、helpersディレクトリということになります。

ここからは、実際にソースコードを見ながら確認していきましょう。

下準備

まず、helpersの中のファイルは、コントローラー生成時に自動生成されます。

今回は、記事管理を担当するarticlesコントローラーを元に話を進めます。

rails g controller articles

こうすると、生成されるファイルの中に

create    app/helpers/articles_helper.rb

があるのを確認できると思います。

このファイルを、コードエディターで見てみると、

articles_helper.rb
module ArticlesHelper
end

と、moduleだけがあるファイルを確認できるかと思います。

また、何でもいいので一つerbファイルを作成しましょう。
今回は、views/articles/index.html.erbという風にファイルを生成し、話を進めていきます。

ヘルパーメソッドを作成

それでは、結論で述べたように、ヘルパーメソッドを作成してみます。

articles_helper.rb
module ArticlesHelper
  def title_name(author, title)
    "#{title} by #{author}"
  end
end

こんな風に、記事のタイトルと作者をまとめて表示するメソッドを作成します。

ここで作成したメソッドを、実際に表示してみます。

views/articles/index.html.erb
<%= title_name("齋藤", "ヘルパーメソッドとは")%>

結果は以下の通りです。

このように、引数に代入した文字通りに出力されました。

以上のことから、二つのことがわかります。

  • ヘルパーメソッドと言ってもrubyのメソッド作成文法がわかっていれば、難なく作成できる
  • ヘルパーメソッドは、railsのビューに影響を与えるもの。具体的には、rubyの文法を用いて機能を追加できる。

入力された文字列をURL判定させる。(おまけ)

今回のヘルパーメソッドを用いると、入力させたurlの要素が入った文字列を表示するときに、urlであると認識させることが可能になります。

application_helper.rb
module ApplicationHelper
  require 'uri'

  def text_url_to_link(text)
    URI.extract(text, %w[http https]).uniq.each do |url|
      sub_text = ''
      sub_text << '<a href=' << url << ' target="_blank">' << url << '</a>'

      text.gsub!(url, sub_text)
    end

    text
  end
end

このソースコードは、こちらの記事から転用となりますが、簡単にまとめると「httpとhttpsが文字列の中にあったら、aタグつけてリンク化するわ!」という機能を持つメソッドです。

やはり、ビューでメソッドを利用できることは、可能性がいろいろ広がりますね。

最後に

最後まで読んでいただき、ありがとうございます。
ソースコード、記事の書き方について「もっとこうしたほうがいいよ!」というご意見、「そこどうなっているの?」というご質問など、お待ちしております。

参考文献