LoginSignup
0
0

【Rails】form_withのf.check_box未チェック時にfalseパラメータを送らないで!

Last updated at Posted at 2023-12-03

やりたいこと

商品一覧画面で以下のような商品群の中から「在庫切れ」「価格変動あり」
それぞれもしくは両方の条件に一致するものをチェックボックスで絞り込みたい。

商品1 在庫なし
商品2 在庫なし 価格変動あり
商品3      価格変動あり
etc...

やったこと

form_withで以下のように実装

search.slim
  / 在庫切れチェック
  = f.check_box :out_of_stock_alert_eq,
    class: 'form-check-input'
  = f.label :purchase_operation_out_of_stock_alert_eq, '在庫なし'
  
  / 価格変動チェック
  = f.check_box :changed_price_alert_eq,
    class: 'form-check-input'
  = f.label :purchase_operation_changed_price_alert_eq, '価格変動あり'

この内容で検索したところ商品1-3すべてヒットせず。
コントローラに飛んできたパラメーターを確認したところ以下のようになっていた。

[2] pry(#<AlertsController>)> params[:q][:out_of_stock_alert_eq]
=> "0"
[3] pry(#<AlertsController>)> params[:q][:changed_price_alert_eq]
=> "0"

調べたところform_withを使用した場合、Railsさんが親切に以下のようにhiddenのHTMLを生成してくれているらしい。

<input name="q[out_of_stock_alert_eq]" type="hidden" value="0">
<input class="form-check-input" type="checkbox" value="1" name="q[out_of_stock_alert_eq]" id="q_out_of_stock_alert_eq">

そのため、フォームのチェックボックスが未チェックだと"0"がパラメーターとして送られてしまい、
商品1-3はすべて条件に合致せず検索にヒットしなくなってしまう。

ちなみにこれはform_withを使用した場合でありcheck_box_tagではhiddenは自動生成されない。

解決策

引数にinclude_hidden: falseを指定してあげればOK。

search.slim
  / 在庫切れチェック
  = f.check_box :out_of_stock_alert_eq,
    include_hidden: false,
    class: 'form-check-input'
  = f.label :purchase_operation_out_of_stock_alert_eq, '在庫なし'
  
  / 価格変動チェック
  = f.check_box :changed_price_alert_eq,
    include_hidden: false,
    class: 'form-check-input'
  = f.label :purchase_operation_changed_price_alert_eq, '価格変動あり'

参考記事:
https://qiita.com/munky69rock/items/febd65ba35dc183052f0

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0