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