Search code examples
ruby-on-railssortingparametersinitializationransack

How do I set a default sort parameter in Ransack to avoid error: "undefined method `[]' for nil:NilClass"?


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

Solution

  • 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?