1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

一覧画面に検索機能実装 Rails ransack

Last updated at Posted at 2024-06-20

はじめに

今回はRailsの検索機能実装でransackを使用したので、使い方について記載します。
Rails初心者のため、間違いなどあればご指摘お願いします。

ransackとは

Railsで検索の実装を行うgemのことです。
ransackがなくても検索の実装はできるのですが、ransackを使用することで簡単に検索機能の実装が可能です。

使い方

①Ransackインストール

Gemfile
gem `ransack` 
コマンド
# アプリをインストールする
$ bundle install

②コントローラを修正する

検索ワードを受け取り、検索結果をインスタンス変数にセットします。

tasks_controller.rb
  def index
    @q = current_user.tasks.ransack(params[:q])
    @tasks = @q.result(distinct: true).recent
  end

③ビューを修正する

tasks/index.html.slim
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).

task.rb
  def self.ransackable_attributes(auth_object = nil)
    ["name"]
  end

⑤実行

無事検索ワードを入れて、絞り込みができるようになりました。

スクリーンショット 2024-06-21 8.31.30.png

参考文献

現場で使える Ruby on Rails 5速習実践ガイド
→現在Railsのインプットで使用しており、とても分かりやすい本です。

71FB8RzWdsL.SY522.jpg

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?