自力でプルダウンなど、文字入力以外の検索方法やソート機能を実装しようとすると少し大変かもしれませんが、gemのransackを用いると超簡単に作れてしまいます。
手っ取り早く実装してみたい人向けです。
細かい仕様等は公式ドキュメントを参照してください。
前提
- crud実装済み
- 本記事ではpostモデルでMVCを組んでいます
実装
gemのインストール
gem 'ransack' #追記
追記後ターミナルでbundle install
を実行
controller記述
class PostsController < ApplicationController
def index
@posts = Post.all #投稿一覧表示用(もともとある前提)
@q = Post.ransack(params[:q]) #追記
@posts= @q.result #追記
end
end
view記述
<%= search_form_for @q do |f| %>
<%= f.search_field :title_cont %>
<%= f.submit "search" %></p>
<% end %>
検索フォームでは<%= f.search_field :title_cont %>
のtitle_cont
部分のように
カラム名_オプション
というようなransack特有の記述をします。
※本記事の場合、title
カラムを部分検索できる_cont
を利用しているという形になります。
この記事では紹介しきれないので詳しくは↓を参考にしてください。
カラム名にオプションを付ければ、セレクトボックスやプルダウン、ラジオボタンで検索を行うことも可能です。
コード自体も一般的な記法にカラム名_オプション
としてするだけなので、是非色々試してみてください。
ソート機能
検索の他にも指定したカラムを昇順⇔降順
に並び替えも実装することが可能です。
その際viewの記述は以下のようになります。
<%= sort_link(@q, :カラム名, "表示したい文字") %>
詳しい仕様は以下記事を参考にしてください。
よくあるエラー
実装して確認しようとすると以下の様なエラーが出るかと思います。
Ransack needs HogehogeModel attributes explicitly allowlisted as
searchable. Define a `ransackable_attributes` class method in your `HogehogeModel`
model, watching out for items you DON'T want searchable (for
example, `encrypted_password`, `password_reset_token`, `owner` or
other sensitive information). You can use the following as a base:
class HogehogeModel < ApplicationRecord
# ...
def self.ransackable_attributes(auth_object = nil)
["created_at", "id", "hogehoge_1", "hogehoge_2", "hogehoge_3", "updated_at"]
end
# ...
end
解決策
ご自身のエラー文内にある
def self.ransackable_attributes(auth_object = nil)
~~~ご自身のカラムの情報~~~
end
の部分を実装しているモデルに張り付けることにより解消されます。
※本記事の場合Postモデルに張り付ける。
また、アソシエーションを行っている場合再度似たようなエラー文が出ます。
def self.ransackable_associations(auth_object = nil)
~~~省略~~~
end
先程と似ていますが前回ransackable_attributes
だったのに対し、今回はransackable_associations
と表記されています。
こちらも同じくモデルに張り付けることでエラーが解消します。
参考