LoginSignup
0
0

More than 3 years have passed since last update.

helperメソッド

Posted at

モジュール

モジュールとは、Rubyにおける「インスタンスを生成できないクラス」のようなもののことです。
下記のように定義します。

module モジュール名

end

また、モジュールの中にはクラスを定義することもできます。

module Sample
  class Test
  end
end

この「Testクラス」は下記のようにして呼び出すことができます。

Sample::Test
クラスとモジュールの使い分けとして、具体的なオブジェクトを生成したい場合(インスタンスを生成したい場合)はクラスを使用し、処理だけ(メソッドなど)が必要な場合はモジュールを使用するという認識で構いません。
またモジュールの中にクラスを定義するメリットは、Testクラスが複数ある場合に、下記のような記述でクラスごとに区別ができることです。

module Sample1
 class Test
 end
end
module Sample2
 class Test
 end
end

Sample1::Test
Sample2::Test
こうすることで、同じクラス名でも定義することができ、それぞれ区別して使用することができます。

それでは、ヘルパーメソッドを作成するモジュールを見ていきます。

Helper
Helperとは、ヘルパーメソッドを作成できるモジュールです。
app/helpers配下に用意されており、application_helper.rbや、各コントローラーに対応したhelperのファイルに処理を記述することでヘルパーメソッドとして使用できます。実際には〇〇Helperという形で定義されます。

application_helper.rb

module ApplicationHelper
  def sample
    # sampleというヘルパーメソッドです
  end
end

このようにApplicationHelper内へメソッドとして定義すると、下記のようにビューファイルで使用できます。

index.html.erb
<%= sample %>

ビューファイルへRubyの処理をたくさん記述してしまった場合や、繰り返し同じ処理を記述する場合は、可読性が落ちてしまうのでヘルパーメソッドとして切り出します。

ヘルパーメソッドを使用してみよう

ヘルパーメソッドを定義しましょう

下記の6行目から始まるeachメソッドを使用してツイートを繰り返し表示する部分を、ヘルパーメソッドとして切り出します。

app/views/tweets/index.html.erb
<%= form_with(url: search_tweets_path, local: true, method: :get, class: "search-form") do |form| %>
  <%= form.text_field :keyword, placeholder: "投稿を検索する", class: "search-input" %>
  <%= form.submit "検索", class: "search-btn" %>
<% end %>
<div class="contents row">
  <% @tweets.each do |tweet| %>
    <%= render partial: "tweet", locals: { tweet: tweet } %>
  <% end %>
</div>

ヘルパーメソッドをtweets_helper.rbへ定義しましょう

app/helpers/tweets_helper.rbのファイルを開き、tweet_listsというメソッドを定義してください。このメソッドがヘルパーメソッドになります。

app/helpers/tweets_helper.rb
module TweetsHelper
  def tweet_lists(tweets)
    html = ''
    tweets.each do |tweet|
      html += render(partial: 'tweet',locals: { tweet: tweet })
    end
    return raw(html)
  end
end

処理を1つずつみていきましょう。

app/helpers/tweets_helper.rb

  def tweet_lists(tweets)
    html = ''

# 省略

  end

まずは、2~3行目です。
2行目で「tweet_listsメソッド」を定義して、引数として「tweets」を持たせます。
3行目では、空の箱として「html = ''」を生成します。
この箱の中に、ツイート情報を代入します。

app/helpers/tweets_helper.rb
    tweets.each do |tweet|
      html += render(partial: 'tweet',locals: { tweet: tweet })
    end

4~6行目では、tweetsに対してeachメソッドで繰り返し処理を行います。
そして、tweetに関する部分テンプレートを呼び出しています。この部分テンプレート内で扱うtweet情報は、「変数tweet」とます。
呼び出した部分テンプレートを、先程生成したhtmlに代入します。

app/helpers/tweets_helper.rb
    return raw(html)

最後に7行目です。
raw()は、HTMLを正常に表示するためのメソッドと覚えていただいて問題ありません。具体的には、「<」「>」「&」などの、特殊文字と呼ばれる文字を意図するように扱うためのメソッドです。raw(文字列)とし、rawメソッドに引数で渡した文字をフォーマットするイメージです。これをしないと、文字化けしてしまうケースがあります。
そして、ここまでの処理を、tweet_listsメソッドの実行結果としてreturnで返します。

ヘルパーメソッドを呼び出しましょう

次に、index.html.erbで先ほど定義したtweet_listsメソッドを呼び出します。index.html.erbを下記のようににします。

app/views/tweets/index.html.erb
<%= form_with(url: search_tweets_path, local: true, method: :get, class: "search-form") do |form| %>
  <%= form.text_field :keyword, placeholder: "投稿を検索する", class: "search-input" %>
  <%= form.submit "検索", class: "search-btn" %>
<% end %>
<div class="contents row">
  <%= tweet_lists(@tweets) %>
</div>
0
0
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
0
0