[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を使う