[Ruby on Rails 5] form_with でシンプルなサーチフォームを作成する

RailsCasts の Simple Search Form を復習。
form_with で書き換えます。

[markdown]
## 復習

テキストフィールドに検索ワードを入力するシンプルなフォーム。

> * [#37 Simple Search Form – RailsCasts](http://railscasts.com/episodes/37-simple-search-form)
> * [#37 Simple Search Form – RailsCasts / comment](http://railscasts.com/episodes/37-simple-search-form?view=comments#comment_155647)

### View

`/items?utf8=✓&search=foo` とするためには `method: :get` や `name: nil` がポイントです。
以下で付与されている `class` は Bootstrap のものです。

“`ruby:app/views/items/index.html.haml
= form_tag items_path, method: :get do
.form-group
= label_tag :search
= text_field_tag :search, ”, class: ‘form-control’
.form-group
= label_tag :price
= number_field_tag :min_price, ”, class: ‘form-control’, placeholder: ‘min. price’
= number_field_tag :max_price, ”, class: ‘form-control’, placeholder: ‘max. price’
= submit_tag ‘Search’, class: ‘btn btn-primary’, name: nil
“`

### Controller

コントローラでは、`models/item` の `#search` クラスメソッドを呼ぶだけにします。
ページネーションがあれば `.page(params[:page])` を追加します。

“`ruby:app/controllers/items_controller.rb
class ItemsController < ApplicationController before_action :set_item, only: [:show, :edit, :update, :destroy] def index @items = Item.search(params).page(params[:page]) end ``` ### Model プレースホルダ `name LIKE ?` を利用して `where` で絞り込みます。 いくつか検索条件も追加します。 ```ruby:app/models/item.rb class Item < ApplicationRecord def self.search(params) results = all.order(created_at: :desc) results = results.where('name LIKE ?', "%#{params[:search]}%") if params[:search].present? results = results.where('price >= ?’, params[:min_price]) if params[:min_price].present?
results = results.where(‘price <= ?', params[:max_price]) if params[:max_price].present? results end ``` ## form_with Rails v5.1 で `form_with` が導入されました。 > * [[Rails 5.1] ‘form_with’ APIドキュメント完全翻訳](https://techracho.bpsinc.jp/hachi8833/2017_05_01/39502)

書き直してみます。

> * [form_with search field in Rails 5.1 – Stack Overflow](https://stackoverflow.com/questions/43013354/form-with-search-field-in-rails-5-1)
> * [Rails 5.1’s form_with vs. form_tag vs. form_for – Patrik on Rails](https://m.patrikonrails.com/rails-5-1s-form-with-vs-old-form-helpers-3a5f72a8c78a)

“`ruby:app/views/items/index.html.haml
= form_with url: items_path, method: :get, local: true do |f|
.form-group
= f.label :search
= f.text_field :search, class: ‘form-control’
.form-group
= f.label :price
= f.number_field :min_price, class: ‘form-control’, placeholder: ‘min. price’
= f.number_field :max_price, class: ‘form-control’, placeholder: ‘max. price’
= f.submit ‘Search’, class: ‘btn btn-primary’, name: nil
“`

## 補遺

> * [#111 Advanced Search Form (revised) – RailsCasts](http://railscasts.com/episodes/111-advanced-search-form-revised)
> * [Rails 5.1とBootstrapで作るシンプルな検索機能のテンプレ | 酒と涙とRubyとRailsと](http://morizyun.github.io/blog/search-form-rails-bootstrap/)
[/markdown]