こんにちは!kossyです!
本日の気になったニュースはこちら
https://headlines.yahoo.co.jp/hl?a=20181024-00000019-mai-sociheadlines.yahoo.co.jp
地方での取組みですが、ここで成功すれば全国に広がるのではないでしょうか。
この取組みで集めたデータを別の事業活動に役立てたいですね。
とは言ってみたものの特に思いつかない頭の硬さ、、、笑
実際に現場に出て活動してみないとわからないことも多そうです。
さて、今回はransackを使わずに、whereメソッドで簡単な検索機能を実装するやり方を
ブログに残してみたいと思います。
アプリ概要
よくある本のレビューサイトのようなものをサンプルとして扱います。
モデル名はReview、Userとしておきます。
ルーティング設定>
prefixを使いたいため、collectionオプションを使ってルーティング定義をしています。
collectionオプションについては
www.rubylife.jp
こちらの記事が詳しかったです。
config/routes.rb resources :reviews do collection do get 'search' end end
コントローラ実装
ルーティングでsearchというアクションを指定しているので、searchアクションを作成します。
app/controllers/reviews_controller.rb class ReviewsController < ApplicationController 省略 def search @results = Review.where('language LIKE ?', "%#{params[:language]}%").order(created_at: 'DESC') end 省略 end
上記のアクションを説明すると、whereメソッドの中で検索したいカラム名languageを指定し、
メタ文字である?で動的なパラメータに対応できるようにします。
params[:language]で検索したいキーワードを受け取り、
該当するレコードをorderメソッドで作成日順に並び替えて取り出しています。
検索画面
検索結果を部分テンプレート化しています。(hamlで記述しています)
search.html.haml = form_tag('/reviews/search', method: :get) do = select_tag :language, options_for_select([["",""], ["HTML&CSS","HTML&CSS"], ["Sass","Sass"], ["Javascript","Javascript"], ["React","React"], ["Vue.js","Vue.js"], ["python","python"], ["Ruby","Ruby"], ["Java","Java"], ["Golang","Golang"], ["Swift","Swift"], ["Kotlin","Kotlin"], ["Ruby on Rails","Ruby on Rails"], ["Django","Django"], ["Laravel","Laravel"], ["playframework","playframework"], ["SQL","SQL"]], params[:language]), {} = submit_tag '検索' = render "result" _result.html.haml %table.table.table-hover.boards__table %thead.thead-dark %tr %th タイトル %th 作成者 %th レベル %th 言語 %th 作成日時 %tbody - @results.each do |result| %tr %th= link_to "#{result.bookname}", result %th= result.user.name %th= result.level %th= result.language %th= result.created_at.to_s(:datetime)
モデルに紐付いたレコードを作成するわけではないので、
form_tagを使っています。
form_forとform_tagの使い分けは以下の記事が詳しかったです。
qiita.com
検索窓はセレクトボックスを生成するビューヘルパーである、
select_tagを使って実装しています。
検索結果のユーザー名はアソシエーションで記述しています。
詳しく知りたい方は
https://qiita.com/To_BB/items/47d2c7b1bc3513025d7bqiita.com
こちらの記事を参考にしてみてください。
検索結果の見た目はbootstrapで整えています。
サンプル動作
こんな動作になると思います。