Help us understand the problem. What is going on with this article?

railsで検索フォームを作ろう!!

More than 1 year has passed since last update.

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の表示

search.html.erb
<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を使い)で、検索ワードを含むデータを出力。

メイン処理

posts_controller.rb
  def search
    #Viewのformで取得したパラメータをモデルに渡す
    @posts = Post.search(params[:search])
  end

searchメソッドの定義

post.rb
    def self.search(search)
      return Post.all unless search
      Post.where(['content LIKE ?', "%#{search}%"])
    end

上記が少しわかりにくい人は下の書き方でもOKです!

post.rb
    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に描くだけですね。

search.html.erb
<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ということで。

以上で、検索フォームの実装は終了です。
読んでいただきありがとうございました。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした