This is a beginner's question, and hopefully will have a simple answer!
I have a Rails 7 app that includes a parks index page. I am using Ransack that lets the user sort by distance, rating, or name. If a sort value is set (e.g. I load the URL http://localhost:3000/en?q%5Bs%5D=distance+desc
) then it works fine. But I'm getting the following error when you load the parks index with no sort applied:
undefined method `[]' for nil:NilClass
How can I set a default initial sort [:s]
value (e.g. "average_rating desc")? (Note: If I simply remove .order(params[:q][:s])
then the distance sort doesn't work properly.)
class ParksController < ApplicationController
def index
@parks = @q.result(distinct: true).includes(:visited_users, :favorited_users).order(params[:q][:s]).near(@user_coordinates, 100000000).paginate(page:params[:page], :per_page => 24)
end
end
class ApplicationController < ActionController::Base
before_action :set_search
def set_search
@q = Park.ransack(params[:q])
end
end
I tried adding this line (@q.sorts...) and it didn't work:
def set_search
@q = Park.ransack(params[:q])
@q.sorts = ['average_rating desc', 'distance asc'] if @q.sorts.empty?
end
Updated to add definition for @user_coordinates:
class ApplicationController < ActionController::Base
before_action :set_user_coordinates
def set_user_coordinates
if Rails.env.production?
@user_coordinates = request.location.coordinates
else
@user_coordinates = [32.0908425,34.8154259]
end
end
end
search link helper with default_order values as given in doc https://activerecord-hackery.github.io/ransack/getting-started/simple-mode/#search-link-helper
@parks = @q.result(distinct: true)
.includes(:visited_users, :favorited_users)
.near(@user_coordinates, 100000000)
.paginate(page: params[:page], :per_page => 24)
To specify a default search sort field + order in the controller index:
@q.sorts = 'name asc' if @q.sorts.empty?