👋

実務でやったらヤバい❗️ Railsでview、controllerにロジックを書くのは良くない。

2023/12/31に公開

概要

スクールとか個人開発だとぶっちゃけ動けばOKの場合があります。
しかし、実務だと通用しないです。
読みやすいコード、システムに影響がないかなど考慮しなければいけません。

そこでバックエンド開発でviewにロジックを書くのは良くないとアドバイスをいただいたので
その時のことを書いていきます。

なぜviewではロジックを書くことはよくないか

理由は以下の4点みたいです。

1.MVCアーキテクチャの原則に従わなければいけない
MVCにおいてViewは見た目の役割があるので、ロジックを書く場所ではないです。

2.コードが整理されて読みやすくしなければいけない(可読性と保守性の向上)
可読性と保守性が失われたら、バグが発生したり、後から入ってきたエンジニアがわかりづらいコードになり、自分がいなくなってから迷惑がかかります。

3.バグの発見が遅れる(テストの難化対策)
これはかなり致命的です。

4.コードの再利用ができなくなる
ロジックをビューに埋め込むと、その部分のコードが他の場所で再利用しにくくなります。モ
デルやコントローラにロジックをまとめておくと、同じ処理を別の場所でも利用できます。

自分が入ったことある現場ではhelpersにロジックを書くことが多かったです。

こんな書き方をして失敗した

自分の失敗例を見てみてください。実際に自分が使用したコードは出せないので、
ChatGPTに出してもらいました。

商品の値引き率を計算して表示するシンプルなウェブページです。

<% discount_rate = calculate_discount_rate(@product.price) %>
<h1><%= @product.name %></h1>
<p>値段: <%= @product.price %> 円</p>
<p>割引率: <%= discount_rate * 100 %>%</p>
<p>割引後の価格: <%= @product.price - (@product.price * discount_rate) %></p>

これをモデルやコントローラに移す例

実際はロジックはコントローラーやviewに書いていきます。

class Product < ApplicationRecord
  def discounted_price
    discount_rate = calculate_discount_rate(price)
    price - (price * discount_rate)
  end

  private

  def calculate_discount_rate(price)
    # ここに割引率を計算するロジックを実装
    # この例では単純にランダムな値を返す仮の実装
    rand(0.1..0.3)
  end
end

class ProductsController < ApplicationController
  def show
    @product = Product.find(params[:id])
  end
end
# app/controllers/products_controller.rb

class ProductsController < ApplicationController
  def show
    @product = Product.find(params[:id])
  end
end

コントローラーも同じ

ページネーションの実装をした時に、ページネーションロジックもService(サービスクラス)で実装
してほしいとレビューで指摘が入りました。
Controllerにページネーションのロジックを書いてPRを出したためです。
Controllerのアクションはリクエストハンドラーと同義なので、
コントローラはリクエストを受け取って、アクションはレスポンスを返すだけなので、
具体的なビジネスロジックを記載しないのが原則と指摘されました。

Railsならビジネスロジックは、ServiceクラスやDecoratorに記載するのがいいです。

Discussion