【Rails7】.to_iメソッドと||演算子でカート内の商品数が0になる不具合

Railsでセッションベースのカート機能を実装する際に遭遇した不具合について、原因と解決策を投稿します。

環境

背景

アプリケーション内にて、商品一覧ページから「add to cart」ボタンを押すと、該当の商品を「1つ」カートに追加する機能の実施を試みました。

def add_item
  item_id = params[:item_id]
  quantity = params[:quantity].to_i || 1

商品詳細ページからは任意の数量を指定してカートに追加できる仕様にするため、以下のようにquantityに数値を入れます。

  • paramsでquantityが渡ってくる -> その数値を入れる
  • paramsでquantityが渡ってこない -> 1を入れる

なお、quantityを数値として管理したいため、.to_iメソッドを使用しています。

不具合の内容

カート内の商品数量がすべて0に設定されてしまうという問題が発生しました。

不具合の原因

.to_iメソッドの仕様によるものでした。

商品一覧ページからカートに商品を追加した場合はparams[:quantity]nilになるため、1がquantityに入れられるはずです。

しかし.to_iメソッドは、params[:quantity]nilか空文字の場合、これを0と解釈してしまうようです。

そのため、

quantity = params[:quantity].to_i || 1

||演算子の左側が真になる(0になる)ので、カート内の商品数が0になってしまっていたようです。

解決策

この問題を解決するためには、
まず.present?メソッドでparams[:quantity]の存在を確認し、その後適切に値を設定する必要があります。

三項演算子を使う
quantity = params[:quantity].present? ? params[:quantity].to_i : 1
if文を使う
if params[:quantity].present?
  quantity = params[:quantity].to_i
else
  quantity = 1
end