【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