A

プログラミングの学習記録

【本日の学習内容: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