【Rails】Rails tutorialの『Partialリファクタリング』が美しくて感動しました

ruby-on-rails

こんにちは。たなか(@tanaka_ricecake)です。

先日Railsチュートリアル一周目が完了しました。

https://twitter.com/tanaka_ricecake/status/1147529005236494336

2019/07/06 #今日の積み上げ です!

・ブログ1本生産

・Railsチュートリアル完了

#Railsチュートリアル 1周目完了しました!
テストなどスルーしてきた部分も多く、すぐ2周目に入りますが、ひとまず今夜は1周目の喜びに浸ります

今日もおつかれわたし!

 

今回は10章で紹介されていたPartialのリファクタリングについて、個人的に目から鱗だったので備忘録的にシェアしてみようと思います。

Railsチュートリアル10章 「二段階のpartialリファクタリング」

以下のような、ユーザー一覧を表示させるコードを、より短く書くという内容です。

users/index.html.erb
<ul class="users">
  <% @users.each do |user| %>
    <li>
      <%= gravatar_for user, size: 50 %>
      <%= link_to user.name, user %>
    </li>
  <% end %>
</ul>

一段階目のリファクタリング

 

一度目はeach文の中の<li>のをヘルパーに切り出すというものです。

以下のように書きます。

 

<ul class="users">
  <% @users.each do |user| %>
    <%= render user %>
  <% end %>
</ul>

 

ポイントはrenderがファイル名を指定した書き方ではないところです。

ここでは、renderをパーシャル (ファイル名の文字列) に対してではなく、Userクラスのuser変数に対して実行している点に注目してください

この場合、Railsは自動的に_user.html.erbという名前のパーシャルを探しにいくので、このパーシャルを作成する必要があります。

 

<%= render user %> のようにrenderにリソース名を指定することができます。

上記のように書くと自動的に

app/views/リソース名/_モデル名.html.erb

というファイルを指定したことになります。

なのでパーシャル化した_user.html.erbを新規作成しつつ、以下のような内容を記述することで<li>内をヘルパーに切り出せます。
<li>
  <%= gravatar_for user, size: 50 %>
  <%= link_to user.name, user %>
</li>

二段階目のリファクタリング

4行分を1行にできたので、ここまででもリファクタリング成功ですが、Railsチュートリアルはこれだけでは終わりません。

上記のコードはさらに最終的に以下のように書くことができます。

users/index.html.erb
<ul class="users">
  <%= render @users %>
</ul>

Railsは@users をUserオブジェクトのリストであると推測します。

さらに、ユーザーのコレクションを与えて呼び出すと、Railsは自動的にユーザーのコレクションを列挙し、それぞれのユーザーを_user.html.erbパーシャルで出力します。

これによりコードは極めてコンパクトになります。

 

Railsの用意してくれている書き方で、render @users のようにすると自動的に

 

<% @users.each do |user| %>
  <%= render user %>
<% end %>

 

のようになります。

最初は6行使ってユーザー一覧をぐるぐる回していましたが、最終的には<%= render @users %>の一行で完結してしまいました。すごいぜ!

まとめ

ruby-on-rails

ということでRailsチュートリアル完走報告と感動した章についてのシェアでした。

業務の間を縫いつつ結構バタバタと進めてしまったので、サラッと流した箇所やテストなどを踏まえて2周目頑張ってみようと思います。

そのうちRailsチュートリアル完走のコツやハマったエラーまとめ記事なども書いてみますのでお楽しみに。

短いですが今回はここまで。

関連サイト

https://railstutorial.jp/chapters/updating_and_deleting_users?version=5.1#sec-partial_refactoring

コメントを残す

メールアドレスが公開されることはありません。