メルカリのコピーサイトを作成しているのですが
商品検索の画面で気づきがあったため備忘録
実装したい機能
あいまい検索
何もヒットしない時は0件と表示させ、新着アイテムを表示させる
-controller
def search
@items = Item.where('name LIKE(?)', "%#{params[:keyword]}%").order("id ASC").page(params[:page]).per(15)
if @items.count == 0
@all_items = Item.limit(25).order("id DESC")
end
(viewでも条件分岐させ、@items
と@all_items
のどちらかをeachで表示させます)
アイテムが引っかかったら@items
を、引っかからなかったら@all_items
に新着アイテムを代入
→これで実装できるはず!
課題
検索がヒットした時は結果表示
→OK!(結果が表示される)
検索ワードがヒットしなかった時
→OK!(結果は0件と表示され、新着情報が表示される)
検索ワードが空欄の時
→NG。。(全件取得される)
なんで??
原因
あいまい検索のコードが原因のよう
Item.where('name LIKE(?)', "%#{params[:keyword]}%")
検索欄が空欄のときは全件とれてしまうのがSQLの仕様っぽいので条件分岐が必要のようです。。
https://qiita.com/nogitsune413/items/9c939f50714e430461c8
解決
params[:keyword]=""
の時に、リダイレクト先を設定することで解決!
リダイレクト先は'/items/search?utf8=✓&keyword=+++'
を指定しています。
(名前を空欄にできないDB設計のためヒットすることはないはず、、?)
-controller
def search
@items = Item.where('name LIKE(?)', "%#{params[:keyword]}%").order("id DESC").page(params[:page]).per(15)
if params[:keyword] == ""
redirect_to '/items/search?utf8=✓&keyword=+++'
end
if @items.count == 0
@all_items = Item.limit(25).order("id ASC")
end
end
コード的にはあまり美しくないのでいい書き方があればご教示ください