はじめに
今回はRailsの検索機能実装でransackを使用したので、使い方について記載します。
Rails初心者のため、間違いなどあればご指摘お願いします。
ransackとは
Railsで検索の実装を行うgemのことです。
ransackがなくても検索の実装はできるのですが、ransackを使用することで簡単に検索機能の実装が可能です。
使い方
①Ransackインストール
gem `ransack`
# アプリをインストールする
$ bundle install
②コントローラを修正する
検索ワードを受け取り、検索結果をインスタンス変数にセットします。
def index
@q = current_user.tasks.ransack(params[:q])
@tasks = @q.result(distinct: true).recent
end
③ビューを修正する
h1 タスク一覧
= search_form_for @q, class: 'mb-5' do |f|
.form-group.row
= f.label :name_cont, '名称', class: 'col-sm-2 col-form-label'
.col-sm-10
= f.search_field :name_cont, class: 'form-control'
.form-group
= f.submit class: 'btn btn-outline-primary'
= link_to '新規登録', new_task_path, class: 'btn btn-primary'
_cont
は検索したワードが含まれているレコードを取得するというransackのメソッドです。
「名称に〇〇を含む」という検索をしたいためname_cont
にしています。
④検索画面を開くとエラー
いざ検索画面が出来た!と思い画面を開くと、下記の内容のエラーが出ます。
ransackを使用しているTaskモデルにホワイトリストの追加が必要なようです。
検索に使用するカラムであるname
を記述します。
→検索対象を名称name
に絞ることが可能となり、それ以外のカラムの検索条件がransackに渡されても無視されるようになります。
Ransack needs Task attributes explicitly allowlisted as searchable.
Define a ransackable_attributes
class method in your Task
model, watching out for items you DON'T want searchable (for
example, encrypted_password
, password_reset_token
, owner
or
other sensitive information).
def self.ransackable_attributes(auth_object = nil)
["name"]
end
⑤実行
無事検索ワードを入れて、絞り込みができるようになりました。
参考文献
現場で使える Ruby on Rails 5速習実践ガイド
→現在Railsのインプットで使用しており、とても分かりやすい本です。