Search code examples
ruby-on-railsadvanced-search

Ruby on Rails : Advance search, undefined method [ ] for nil:Nil class


I am very new to rails and try to make an advance search form which takes two values 'blood_group' and 'area' and based upon that search the records from the database are fetched and will display on the same page (find.html.erb) I have tried something in find.html.erb but there is an error occurred 'undefined method [] for nil:Nil class' where my search form exists. please help to get out of this error.

Here is my search form in find.html.erb

<%= form_tag find_path , method: :get do %>

             <p> <%= label_tag :blood_group %><br />
              <%= select_tag (:blood_group), options_for_select(%w[ A+ B+ O+ AB+ A- B- O- AB-]), params[:blood_group] %> </p>

             <p> <%= label_tag :area %><br />
              <%= select_tag (:area), options_for_select(%w[Indore Vijay_Nagar Bhawar_Kuwa Rajendra_Nagar Geeta_Bhawan Aerodram Tejaji_Nagar Raj_Mohalla Rajwada Chandan_Nagar Gandhi_Nagar Arvindo MY Bombay_Hospital]) , params[:area] %> </p> 


              <%= submit_tag "Search" , class: "btn btn-primary" , name: nil %>
            <% end %>

The error is at the lines where I used select tag. below is my find action in Donor controller

def find

    @donors = Donor.search(params[:blood_group], params[:area]).all 

 end

And Donor.rb is as follows

class Donor < ActiveRecord::Base


def self.search(blood_group, area)

    return all unless blood_group.present? || area.present?

    where(['blood_group LIKE ? AND area LIKE ?', "%#{blood_group}%", "%#{area}%"])
end

end


Solution

  • Your search form must be like this:

    <%= form_tag find_path , method: :get, remote: true do %>
    
             <p> <%= label_tag :blood_group %><br />
              <%= select_tag (:blood_group), options_for_select(%w[ A+ B+ O+ AB+ A- B- O- AB-]) %> </p>
    
             <p> <%= label_tag :area %><br />
              <%= select_tag (:area), options_for_select(%w[Indore Vijay_Nagar Bhawar_Kuwa Rajendra_Nagar Geeta_Bhawan Aerodram Tejaji_Nagar Raj_Mohalla Rajwada Chandan_Nagar Gandhi_Nagar Arvindo MY Bombay_Hospital]) %> </p> 
    
    
              <%= submit_tag "Search" , class: "btn btn-primary" , name: nil %>
            <% end %>
    

    Modify your controller as:

    def find
      @donors = Donor.search(params[:blood_group], params[:area]).all 
      respond_to do |format|
        format.js
      end
    end
    

    Then add find.js.erb to show the searched content.