はじめに
Railsのform_withを使って検索したい情報をコントローラーへ送信して、
indexページに一覧表示する機能の実装方法を書いていきます。
実現したいこと
今回はPostテーブルから自分が検索したワードを本文に含んだ投稿を
Postコントローラーのindex.html.erbに一覧表示していきたいと思います。
[実行環境]
Ruby 2.7.2
Rails 6.0.3.4
検索条件の送信
<%= form_with url: posts_path, method: :get, local: true do |f| %>
<%= f.label :post_key, '検索' %>
<%= f.text_field :post_key %>
<%= f.submit, '検索する' %>
<% end %>
今回はindexページで検索結果一覧を表示するので、urlはindexに対応しているpathを入力します。
表示したいページがindexとは異なる場合には表示したいページに対応したurlを入力してください。
methodをgetに指定することでindexに繋がるルーティングを通りindexアクションに
検索したい値を送信することができます。
これを指定しておかないとmethodがpostで送信されてしまいエラーがでます。
:post_keyに検索したい値が格納されるので、
コントローラーに記述するワードと共通していれば:post_keyでなくても任意のワードを指定できます。
検索結果一覧表示のコントローラー
def index
if params[:posts_key]
@posts = Post.where(params[:posts_key])
else
@posts = Post.all
end
end
入力フォームから送信されてきた:posts_keyがここにたどり着きます。
elseの動作は、なにも入力せず検索ボタンを押した場合すべての投稿が表示されるようになっています。
indexページで検索結果を一覧表示
<p>"検索結果: <%= @posts.count %>件</p>
<ul class="posts">
<%= @posts.each do |post| %>
<li class="post">
<%= post.content %>
</li>
<% end %>
</ul>
今回はページネーションを使わずに実装したので、
eachメソッドを使って繰り返し処理を実行して検索結果一覧を表示していきます。
countメソッドを使って検索結果の件数を表示しています。
終わりに
以上の手順で検索機能が実装できるかと思います!
もし不備やわからないところがあれば気軽にコメントして
いただけるとありがたいです!
最後まで読んでいただきありがとうございました!