引数がない時にエラーにならないようにする

タイトルで検索できるようにするため、以下のように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のレコードを引っ張ってくれるようになりました!!