引数がない時にエラーにならないようにする
タイトルで検索できるようにするため、以下のようにindexアクションの中でwhereメソッドを使って検索機能を実装しておりました。
app/controllers/tasks_controller.rb
def index
@tasks = Task.all.includes(:user).order("created_at DESC").where('title LIKE(?)', "%#{params[:keyword]}%")
end
しかし、検索機能はモデルに切り出した方が良いとのことで、以下のように直しました。
app/controllers/tasks_controller.rb
def index
@tasks = Task.all.includes(:user).order("created_at DESC").search(params[:keyword])
end
app/models/task.rb
def self.search(keyword)
where('title LIKE(?)', "%#{keyword}%")
end
しかしこれだと、params[:keyword] がない時にエラーとなってしまいます。
そこで、コードリーディングしている中でしばしば見かけていた、引数に初期値でnilを渡すという方法を行ってみました。
app/models/task.rb
def self.search(keyword = nil)
val ||= ""
where('title LIKE(?)', "%#{keyword}%")
end
これで、params[:keyword] がない時はnilが代入され、全てのレコードを引っ張ってくれ、params[:keyword] がある時には、部分一致したtitleのレコードを引っ張ってくれるようになりました!!