この記事はプログラミング学習者がアプリ開発中に躓いた内容を備忘録として記事におこしたものです。内容に不備などあればご指摘頂けると助かります。
記事投稿の背景
Xのクローンサイトを制作している時に色々と躓いたので、知識整理も兼ねて記事として残すことにしました。
実際のコード - 変更前
私が制作していたアプリの場合、あるロジックは1箇所だけでなく、合計で12箇所ありました。
ロジックを切り出す前は変更の度に12箇所全てを修正しており、とても手間が
掛かり、時には変更漏れがあったりしました。
- if current_user.present? # ツイートのユーザーとログインユーザーが共に所属するチャットルームが存在するかをデータベースから検索する
- room_with_tweet_user = Room.joins(:entries).where(entries: { user_id: [current_user.id, bookmark.tweet.user.id]}).group('rooms.id').having('COUNT(entries.id) = 2').first
Helperとは?
動作を処理する場合にメソッド化して使えるようにRuby on Railsへ組み込まれた機能です。
Helperは既にRailsの中に沢山登録されており、具体的にはlink_to
, form_with
, image_tag
などが頻繁に使われるHelperとして挙げられます。
また、予め登録されているHelperの他に自分で作成して呼び出すことも可能です。
実際のコード - 変更後
Viewファイルから切り出したロジックをHelperでメソッド化
内容を変更したい場合はこの1箇所を変更するだけで対応できる
def check_rooms(tweet_user)
Room.joins(:entries).where(entries: { user_id: [current_user.id,
tweet_user.id] }).group('rooms.id').having('COUNT(entries.id) = 2').first
end
ロジック部分をメソッドとして切り出しました。
これによりviewファイルは見易くなりました。
ロジックを切り出してからは1箇所だけの修正で済ませられるようになりました。メンテナンス性が格段に上がっています。
- if current_user.present? # ツイートのユーザーとログインユーザーが共に所属するチャットルームが存在するかをデータベースから検索する
- room_with_tweet_user = check_rooms(bookmark.tweet.user)
まとめ
viewにロジックを書かないでHelperメソッドに切り出すことで二つのメリットを確認できました。
1, viewファイルが整理されて短くなることで可読性が上がる
2, 変更する際のメンテナンス性が上がる(変更する場所はHelperメソッド内の1箇所のみ)
逆にロジックをviewに書くことで二つのデメリットが出現します。
1, コード全体が冗長になり、可読性が落ちる
2, 変更する際のメンテナンス性が落ちる(変更する場所はview内の同じロジック全て)
数が増えるほど大変で変更漏れも起こる