260
264

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-05-30

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ということで。

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

260
264
1

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
260
264

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?