Railsで検索フォームを作りましょう。
個人的には、下記の記事を参考にしました。わかりやすいと思います。
Ruby on Rails 検索機能拡張 (railsチュートリアル) https://qiita.com/mochikichi321/items/5c9630c5d87b47130942
検索の流れについて
1.検索formの表示
2.formにて検索ワードを入力(ユーザーが入力する)
3.formから検索ワードを受け取る(Controller)
4.Controller(とModelを使い)で、検索ワードを含むデータを出力。
5.そのデータをViewに渡す。
以上が検索の流れです。
思っていたよりはかなり単純ですね。では、実際の流れについて見ていきます。
1.検索formの表示
<p>検索</p>
<%= form_tag(search_path,:method => 'get') do %>
<%= text_field_tag :search %>
<%= submit_tag 'Search', :name => nil %>
<% end %>
上記が検索フォームとなります。
ポイントは
- form_tagを使う
- methodをgetにする
form_tagはDBの変更に関わらない時に使うものです。
詳しくはこちらを参照ください。https://arrown-blog.com/rails-formfor-formtag/
methodはgetにしておくこと。検索フォームでは、検索結果がすぐ表示された方がいいので(当然ですが)、methodはgetにしておきましょう。
2.formにて検索ワードを渡す(ユーザーが検索する)
これは勝手にユーザーが行ってくれますね。
3.formから検索ワードを受け取る(Controller)
(params[:search])
で検索フォームに入力したものを受け取ります。
4.Controller(とModelを使い)で、検索ワードを含むデータを出力。
メイン処理
def search
#Viewのformで取得したパラメータをモデルに渡す
@posts = Post.search(params[:search])
end
searchメソッドの定義
def self.search(search)
return Post.all unless search
Post.where(['content LIKE ?', "%#{search}%"])
end
上記が少しわかりにくい人は下の書き方でもOKです!
def self.search(search)
if search
Post.where(['content LIKE ?', "%#{search}%"])
else
Post.all
end
end
上記が4の処理です。
メイン処理から説明すると、searchメソッドを使って@postsを出力します。
しかし、searchメソッドを定義しなくてはいけません。ここはモデルに書いていきます。
基本的には、検索というのは whereメソッドを使います。find_byメソッドと似ていますが、whereメソッドは条件にあるものすべてを取得してくるメソッドです。
where(['content LIKE ?', "%#{search}%"])の contentとはPostモデル(データベース)のプロパティです。ここはSQLを学ぶとしっくりくるかと思います。
ちなみに検索ワードがない時(空検索の時)は、全データを持ってくるようにしました。
5.そのデータをViewに渡す。
最後です。あとは、@postsをViewに描くだけですね。
<p>検索</p>
<%= form_tag(search_path,:method => 'get') do %>
<%= text_field_tag :search %>
<%= submit_tag 'Search', :name => nil %>
<% end %>
<ul><% @posts.each do |post| %>
<li>
<%= link_to post.title, post %>
<%= post.created_at %>
<%= post.status %>
</li>
<%= link_to "編集",edit_post_path(post) %>
<%= link_to "削除",post, method: :delete %>
<% end %>
</ul>
先ほどの検索フォーム部分に加えて、検索結果の表示部分も加えました。
インテンドとかぐちゃぐちゃかもですが、見落としてください笑。
あとは、 <%= render @posts %>とかでリファクタリングすると見やすくなるかと思います。ただ私同じぐらいの初心者向けに書いたので、それは次のSTEPということで。
以上で、検索フォームの実装は終了です。
読んでいただきありがとうございました。