0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ransackのチェックボックスをtrue/falseで返したい

Posted at

はじめに

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が不要 (全量表示したい)

参考文献

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?