何を検索できるようにしたい?
タイトルを入力したらその本の情報が出てくる
著者名を入力したらその本の情報が出てくる
あいまい検索したい(今回初めて知りました)
複数の入力で検索をできるようにする
検索画面の表示部分
header.html.rb
<%= form_with(url: '/search', local: true, method: :get) do |form| %>
<%= form.text_field :search_key %>
<%= form.submit 'ぼたん' %>
<% end%>
デフォルトがpostなのでmethod: :get
でgetを指定する
form_with で生成されたフォームは、デフォルトで非同期で送信される。それを避けるためにlocal: true
を指定しないとform_withがどの場所で処理を行えばいいのかわからなくなってしまう
table
db/migrate/books.rb
def change
create_table :books do |t|
t.string :title
t.string :author
タイトルと著者名をとってこれる
controller
controller.rb
def search
# 検索結果をurlに埋め込むのと、モデルで部分一致させる検索結果を送るための処理
@books = Book.search(params[:search_key])
if @books
redirect_to "/search/#{params[:search_key]}"
else
@books = Book.all
redirect_to "/search/#{params[:search_key]}"
end
end
def search_page # 検索結果を表示させるページのコントローラーです!
search_key_word = params[:search_key]
@books = Book.where('title LIKE ? OR author LIKE ?', "%#{search_key_word}%", "%#{search_key_word}%") # titleかauthorのカラムどちらかと部分一致すれば取り出す
if @books.empty?
@book_not_found_message = 'キーワードに該当するページが見つかりません'
render 'search_page'
end
end
# booksテーブルのtitleカラムに部分一致したレコードを返す
Book.where('title LIKE ?', "%#{search_key_word}%")
# booksテーブルのtitleカラムもしくはauthorカラムに部分一致したレコードを返す
Book.where('title LIKE ? AND author LIKE ?', "%#{search_key_word}%", "%#{search_key_word}%")
model
app/models/application.rb
def self.search(search) #selfはBook
if search
where(['content LIKE ?', "%#{search}%"]) #検索結果がcontentと一部でも一致するかどうかをみて一致するものがあればそれをwhereで受け取るはず
else
all #全て表示
end
end
# この部分に対する私の認識は儀式
where(['content LIKE ?', "%#{search}%"])
反省
二つ以上のテーブルを対象に検索することを複数検索だと思ってたけどそんなわけないですね。やはり理解していなかったので気付けてよかった
参考にさせていただきました
[railsで複数ワードでの検索機能(or)とマイナス検索機能(-)を実装してみる]
(https://qiita.com/Orangina1050/items/ca4e5dc26e0a32ee3137)
よんでくれてありがとう