[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]