Ruby
ransack
RubyOnRails
BashOnUbuntuOnWindows

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

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