【Ruby on Rails】簡単なメモアプリの作成|部分テンプレートの実装

作成日: 更新日:

開発環境

  • Ruby:version 3.1.2
  • Ruby on Rails:version 7.0.4
  • Visual Studio Code:version 1.73.0
  • OS:Windows10

Ruby on Railsで部分テンプレートの実装手順

Ruby on Railsの部分テンプレートは重複するフォーマットはもちろん、javascriptによる非同期通信(ajax)にも使用されています。 今回はメモアプリの作成で使用したコードを用いて解説していきます。

部分テンプレートにする前のインデックスビュー

今回、修正していく前のインデックスビューが下記になります。

1<!-- title: memo_app\app\views\memos\index.html.erb -->
2<div class="wrapper">
3    <div class="container flex-start">
4        <div class="col-box-1">
5            <h2>メモ一覧</h2>
6        </div>
7
8        <% if @memo_new.errors.any? %>
9            <div class="col-box-1">
10                <h3><%= @memo_new.errors.count %>件のエラーが発生しました。</h3>
11                <ul>
12                    <% @memo_new.errors.full_messages.each do |message| %>
13                    <li><%= message %></li>
14                    <% end %>
15                </ul>
16            </div>
17        <% end %>
18
19        <div class="col-box-3">
20            <%= form_with model: @memo_new, url: memos_path, local: true, method: :post do |f| %>
21                <div class="memo-header">
22                    <%= f.text_field :title, placeholder: "タイトル", class: "form-box" %>
23                </div>
24                <div class="memo-center">
25                    <%= f.text_area :description, placeholder: "メモ", class: "form-box" %>
26                </div>
27                <div class="memo-footer">
28                    <%= f.submit "作成", class: "btn" %>
29                </div>
30            <% end %>
31        </div>
32        <% @memos.reverse.each do |memo| %>
33            <div class="col-box-3">
34                <%= form_with model: memo, url: memo_path(memo.id), local: true, method: :patch do |f| %>
35                    <div class="memo-header">
36                        <%= f.text_field :title, placeholder: "タイトル", class: "form-box" %>
37                    </div>
38                    <div class="memo-center">
39                        <%= f.text_area :description, placeholder: "メモ", class: "form-box" %>
40                    </div>
41                    <div class="memo-footer">
42                        <%= f.submit "更新", class: "btn" %>
43                    </div>
44                <% end %>
45                <div class="memo-other">
46                    <%= button_to "削除", memo_path(memo.id), method: :delete, class: "btn" %>
47                </div>
48            </div>
49        <% end %>
50    </div>
51</div>

それでは、上記を整理していきながら部分テンプレートを作成していきます。

エラー表示の部分テンプレート

まずはエラー表示はアプリケーションで共通のテンプレートになりますため、「memo_app\app\views\layouts」フォルダ内に部分テンプレートを作成します。

1<!-- title: memo_app\app\views\layouts\_errors.html.erb -->
2<% if obj.errors.any? %>
3    <h3><%= obj.errors.count %>件のエラーが発生しました。</h3>
4    <ul>
5        <% obj.errors.full_messages.each do |message| %>
6        <li><%= message %></li>
7        <% end %>
8    </ul>
9<% end %>

「@memo_new」というインスタンス変数は「obj」というローカル変数に変更しておきます。

メモの新規投稿フォームの部分テンプレート

次に、メモの新規投稿フォームはメモコントローラー内の機能であるため、「memo_app\app\views\memos」フォルダ内に作成していきます。

1<!-- title: memo_app\app\views\memos\_form.html.erb -->
2<%= form_with model: memo_new, url: ajax_memos_create_path, local: false, method: :post do |f| %>
3    <div class="memo-header">
4        <%= f.text_field :title, placeholder: "タイトル", class: "form-box" %>
5    </div>
6    <div class="memo-center">
7        <%= f.text_area :description, placeholder: "メモ", class: "form-box" %>
8    </div>
9    <div class="memo-footer">
10        <%= f.submit "作成", class: "btn" %>
11    </div>
12<% end %>

先ほどと同様に「@memo_new」というインスタンス変数を「memo_new」に変更しておきます。

メモの一覧表示の部分テンプレート

次に、メモの一覧表示はメモコントローラー内の機能であるため、「memo_app\app\views\memos」フォルダ内に作成していきます。

1<!-- title: memo_app\app\views\memos\_list.html.erb -->
2<% memos.reverse.each do |memo| %>
3    <div class="col-box-3">
4        <%= render "memos/show", memo: memo %>
5    </div>
6<% end %>

先ほどと同様に「@memos」というインスタンス変数を「memos」に変更しておきます。

1<!-- title: memo_app\app\views\memos\_show.html.erb -->
2<%= form_with model: memo, url: memo_path(memo.id), local: true, method: :patch do |f| %>
3    <div class="memo-header">
4        <%= f.text_field :title, placeholder: "タイトル", class: "form-box" %>
5    </div>
6    <div class="memo-center">
7        <%= f.text_area :description, placeholder: "メモ", class: "form-box" %>
8    </div>
9    <div class="memo-footer">
10        <%= f.submit "更新", class: "btn" %>
11    </div>
12<% end %>
13<div class="memo-other">
14    <%= button_to "削除", memo_path(memo.id), method: :delete, class: "btn" %>
15</div>

「memo」はすでにローカル変数になっているため、その部分は修正せずにおいておきます。 ここのポイントとしては、一覧表示の「list」の中に詳細表示の「show」は部分テンプレートの中に部分テンプレートが入っている状態になっています。 上記のようにすることにより、テンプレートを効率よく構造化することもできます。

インデックス表示で部分テンプレートを呼び出す

最後にインデックスのビューファイルから部分テンプレートを呼び出していきます。

1<!-- title: memo_app\app\views\memos\index.html.erb -->
2<div class="wrapper">
3    <div class="container flex-start">
4        <div class="col-box-1">
5            <h2>メモ一覧</h2>
6        </div>
7
8        <div class="col-box-1">
9            <%= render "layouts/errors", obj: @memo_new %>
10        </div>
11
12        <div class="col-box-3">
13            <%= render "memos/form", memo_new: @memo_new %>
14        </div>
15
16        <%= render "memos/list", memos: @memos %>
17    </div>
18</div>

8行目を参考に解説していきます。 renderメソッドで部分テンプレートを呼び出していきますが、「"layouts/errors"」viewsというフォルダからみたファイル構成で呼び出すファイルを指定しています。 また、「obj: @memo_new」は「obj」というローカル変数に「@memo_new」という情報を代入しているという流れになります。

キーワード

Ruby on Railsで部分テンプレートについて解説してきましたが、いかがだったでしょうか。 アプリケーションの機能が充実するほど重複するテンプレートは多くなってくるため、どのように部分テンプレートを構築するかはとても重要になってきます。 是非、アプリケーションを管理しやすくするために、部分テンプレートを活用してください。

【Ruby on Rails】簡単なメモアプリの作成|部分テンプレートの実装 | いっしー@Webエンジニア