[part8] Fat Viewの解消 – Rails開発の進め方

こんにちは、へちまです。

これまでチュートリアルなどをみながらアプリを作ってきたので、Viewの中身がごちゃごちゃ…

こういうのをFat Viewと呼ぶらしいですが、今回はこれを解消していきたい。余談ですが、viewに限らず保守性が損なわれることを技術的負債と呼ぶらしい。

ポイントは、クラスメソッド、インスタンスメソッド、部分テンプレート、です。

目標

Viewの中で、投稿の種類によって色を分ける部分があるが、その条件判定をViewに書かず、Modelに移す。

DRYを意識する。(Don’t Repeat Yourself, 重複禁止)

  • Modelに色分けのためのhtmlクラスを返すインスタンスメソッドを追加
  • 複数あるFormを部分テンプレート化する

Viewの中で、モデルのカラムの値に応じて色を変えるロジックをif文で書いていて、しかも複数箇所に同じものをコピペしてあるクソコードだった。コレを直す。

フォームも同じものは纏めたいという思い。

今回の進捗

インスタンスメソッド

post = Post.new などで生成したインスタンスに対して、post.hoge で呼び出せるのがインスタンスメソッド。

post.カラム名でカラムの値が取得できるものだと思っていたが、実際にはRailsが自動で生成したカラム名のメソッド(=インスタンスメソッド)を呼び出し、そのメソッドがカラムの値を返している。

そのメソッドは以下のように自分でも設定できる。

# app/models/post.rb

class Post < ApplicationRecord
     def color_class
         if self.color_num == 0
             return "red_color_class"
         elsif self.color_num == 1
             return "black_color_class"
         else
             return "white_color_class"
         end
     end
 end

ちなみにメソッド内のselfはpost.color_classで読んだ時のpostが入る。

これでpost.color_classで文字列を取得できる。

# app/controllers/posts/index.html.erb

@posts.each do |post|
    <div class="<%= post.color_class %>">
        <%= post.content %>
    </div>
end

などで使用できる。

クラスメソッド

今回は使わなかったが、インスタンスではなくmodel自体に対して使えるメソッドをクラスメソッドという。

Post.hogeなど。 つまりデフォルトのPost.newとかもクラスメソッド。

裏技的にインスタンスの配列に対しても使える。

使い方は関数名の前にself.をつけるだけ。self.hogeがクラスメソッドでhogeがインスタンスメソッド。

# app/models/post.rb

class Post < ApplicationRecord
     def self.second
         return Post.find(2)
     end
 end

など。

部分テンプレート

Viewの中にある共通するコードをコピーして、部分テンプレート化

# app/views/posts/_newform.html.erb
<div class="form">
         <div class="form-body">
             <textarea name="content" required></textarea>
             <input type="submit" value="送信">
         </div>
     </div>
</div>

こんな感じでアンダーバーで始まるファイルを作る。

Viewの埋め込みたいところに以下のように記述する。

 <%= render 'posts/newform'%>

部分テンプレート内で変数を使いたい場合は以下のようにするとnumber という変数に1が格納される。

 <%= render 'posts/newform', number: 1 %>

まとめ

とにかくView内のコピペは無くすべき!見つけたら即置換。

今後の予定

いまさらGemというものを知ったのでそれについて書く。

ということで今日もお疲れさん

おつおつばいばい。

次回 → Gemを使う

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です