LoginSignup
5
4

More than 5 years have passed since last update.

既存サービスにRailsでransackを使って検索機能を作成する

Posted at

Railsでransackを使って検索機能を作成する。

目標:友人と作成しているWebサービスで検索機能をつけたい。

  • Rails:5.0.2
  • ruby:2.4.0
  • Bash on Ubuntu on windows Version 10.0.15063
  • ransack(今回はこちらで実装してみるという記事)

ダミーのプロジェクトでransackを実装してみる。

こちらの記事を参考にさせていただき、ダミーのプロジェクトでransackを実装してみる。
http://ruby-rails.hatenadiary.com/entry/20141008/1412774436

test.gif

既存PJにransackを導入し検索画面を作成する。

この節での目標は友人と作成しているWebサービスに対してransackを導入し、商品に当たるテーブルを検索する画面、検索結果を表示する機能を実装するところである。
(この記事の最終的な目標は上記の通りなので、それまでの1つ目のステップ)

  • ransackをinstallする。
Gemfile
gem 'ransack'

bundle install
Using ransack 1.8.4 インストール時点(2017/12/17)で左記のバージョンがインストールされました。

  • 検索を行いたいテーブルのコントローラーにindexアクションを追加する。
hobbies_controller.rb
  def index
    @q        = Hobby.search(params[:q])
    @hobbies = @q.result(distinct: true)
  end
  • ルーティングを追加する。
routes.rb
 - resources :hobbies, only: %w(create)
 + resources :hobbies, only: %w(index create)
  • 検索機能を実装したいテーブル(hobby)のViewファイルを作成する。
view/hobby/index.html.slim
h1 趣味検索
= search_form_for @q do |f|
  = f.label :name_cont, "キーワード"
  = f.search_field :name_cont
  br/
  = f.submit '検索', class: 'record-form__submit-button'

  table
    thead
      tr
        th 趣味名
    tbody
      - @hobbies.each do |hobby|
        tr
          td = hobby.name
  br/

今検索機能をつけたいテーブルの構造はこんな感じでnameの検索ができれば十分。

db/schema.rb
  create_table "hobbies", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
    t.string   "name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false

結果、趣味の検索ができた。

test2.gif

検索結果にリンクを付け検索結果より別画面に遷移する。

先ほどまでで商品に当たるテーブルを検索する画面、検索結果を表示する機能ができた。ここでは、検索結果の商品(趣味)にリンクをつけて、検索結果のレコ―ドをクリックすると別画面に遷移させる機能を実装する。

  • 検索結果の商品(趣味)にリンクを付ける。 実装としては、商品(趣味)のshowアクションで商品(趣味)個別のページを作成する。
hobbies_controller.rb
  def show
    @hobby = Hobby.find(params[:id])
  end

routes.rbにshowアクションを追加。

routes.rb
 - resources :hobbies, only: %w(index create)
 + resources :hobbies, only: %w(index show create)

showアクションのviewファイルを作成。

view/hobby/show.html.slim
h1 一覧
table
  thead
    tr
      th 趣味名
      td = @hobby.name

indexのviewファイルを変更。

view/hobby/index.html.slim
    tbody
      - @hobbies.each do |hobby|
        tr
-          td = hobby.name
+          td = link_to hobby.name, hobby

以上で、一旦完了。

参考文献

下記参照させていただいた文献一覧です。

http://ruby-rails.hatenadiary.com/entry/20141008/1412774436
https://qiita.com/nysalor/items/9a95d91f2b97a08b96b0
https://qiita.com/nishina555/items/2c1f8bae980e426519bc

5
4
2

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
5
4