検索機能の実装にて学んだこと

今回自作の業務効率化アプリを作成に当たって検索機能の実装を行った。

そこで学んだことを記述する。

 

まず、今回はinteger型の検索機能の実装を行いたかったためform_tagを使用して実装することとした。

 

要件としては、数値を受け取りその数値でデータを検索するといったことを想定しているためまず、そこを考える。

 

= form_tag(works_path, method: "get") do
= label_tag "行路検索"
= number_field_tag :number, params[:number],class: "form-control mb-3"
= submit_tag "行路を検索する", class: "btn btn-primary form-control"

 

まずはindex actionに入力した数値を送りたいので、formを作成する必要がある。form_tagの引数に送り先の名前つきルート、HTTPリクエストの種類を記述。

その次に数値型を送れるnumber_field_tagを記述し数値を送る。

number_field(オブジェクト名, プロパティ名 [, オプション])

このような形で使用する。

number_field - リファレンス - - Railsドキュメント

その次に受け取り先のコントローラーの処理を考える必要があるのだが、この場合コントローラーのindexアクションに書く処理は2通りある。一つ目は検索機能を使用して、欲しいものだけを取り出した処理、二つめは検索機能を使用していない場合の処理。

 

コントローラーに2通りの処理を書くのでもいいのだが、コントローラーの処理が長くなるので、modelに記載する。

def self.search(integer)
if integer.blank?
Work.all
else
Work.where("number = ?",integer)
end
end

この記述で条件分岐を行い、引数のintegerがblankに当てはまるのであれば、全てのレコードを取得するという形で実装ができる。

 

そしてこのクラスmethodを使用して、コントローラーを

def index
@works = Work.search(params[:number])
end

このように実装すれば、コンパクトに検索機能を実装することができる。

 

学んだこと

SQLインジェクションを防ぐため、エスケープしてSQLを記述すること。
・form_tagの使用方法
nil?,empty?,blank?present?の違い。
nil?はnilの場合のみ、trueを返す。emptyはからの文字列や空の配列の場合にtrueを返し、数値などに対して呼び出すとnomethod errorを吐く。blank?はnil,false,"","  ",[],{}の場合にtrueを返す。presentは!blankと言う意味になる。

 

参考:

freesworder.net

qiita.com