はじめに
ransackのチェックボックスを使用した時にはまったのでメモを残します
前提
以下のadminテーブルに退職者カラムがあります。
class Admin < ApplicationRecord
endsuspended :boolean default(FALSE), not null
end
・endsuspended:true(退職している)
・endsuspended:false(退職していない)
View で下記のようにチェックボックスを実装しようとしています。
チェック有り・・・全員表示
チェック無し・・・退職していない人だけ表示
※初期表示は、チェック無しの退職していない人だけ表示させたい
= search_form_for @search, url: admin_admins_path do |f|
= f.check_box :suspended_eq, checked: @suspended, class: "check-box"
はまったところ
Rancackでチェックボックスをチェックして検索するとtrueのみ検索される。チェック外して検索するとfalseのみ絞り込みされてる。
今回の場合は、チェックして検索した場合はtrueとfalseすべて検索、チェック外して検索した場合はfalseのみ検索して欲しい。
これでチェック外した場合はすべて検索されるが、今回はこれの逆パターン、、、
= f.check_box :suspended_true
解決策
①後ろに, true, false
を追記して、パラメーターを数字の文字列の取得から、チェックした時にだけ"suspended_eq"=>"true"が送られるように変更
= search_form_for @search, url: admin_admins_path do |f|
= f.check_box :suspended_eq, { checked: @suspended, class: "check-box" }, true, false
②コントローラー側に以下を記載し、チェックして検索した場合はtrueとfalseすべて検索、チェック外して検索した場合はfalseのみ検索するように実装
params[:q] = {} if params[:q].blank?
params.dig(:q, :suspended_eq).present? ? params[:q].delete(:suspended_eq) : params[:q][:suspended_eq] = false
・params[:q] = {} if params[:q].blank?
は初期表示の場合、ransackのパラメーターが存在しない場合の考慮
・チェック無しの場合(パラメーター送られてこない)・・・suspended_eq: falseが必要 (suspended_eq=falseのみ表示したい)
・チェック有りの場合(パラメーター送られてくる)・・・suspended_eq: trueが不要 (全量表示したい)