【本日の学習内容:Ruby課題4~7】
引き続きRansackを使った検索機能の実装について学びました。
search.html.rbに名前と年齢を入力して検索ボタンを押すと、
rof_tagに設定したURL(/users/search)が飛ぶ。
<%= form_tag('/users/search', method: :get) do %>
<%= label_tag :名前 %>
<%= text_field_tag :search_name %>
<%= label_tag :年齢 %>
<%= text_field_tag :search_age %>
<%= submit_tag '検索' %>
<% end %>
routes.rbでURLを受け取り、users_controller.rbのsearchアクションが実行される。
searchアクションではストロングパラメーターのuser_params_searchメソッドを引数にとって、UserSearchクラスのインスタンスを作る。また、executeメソッドを使うことで、検索機能を実行する。
user_params_searchメソッド内では、search.html.erbの入力フォームに入れた値を引数に格納する。
class UsersController < ApplicationController
def search
user_search = UserSearch.new(params_user_search)
# executeメソッドによる検索結果を@usersに格納
@users = user_search.execute
end
private
def params_user_search
# search.html.erbの入力フォームに入れた値を引数に格納する
params.permit(:search_name, :search_age)
end
end
class UserSearch
include ActiveModel::Model
他のクラスのパラメータを使うから以下をattr_accessorを指定?
attr_accessor :search_name, :search_age
# Userモデルがusersテーブルから@search_name、@search_ageと完全一致するものを探してくる
def execute
User.ransack(name_eq: @search_name, age_eq: @search_age).result
end
end