Search code examples
ruby-on-railsrubyactioncontrollerelasticsearch-rails

If one record found execute show action


I wondering what would be the best practice to perform next task.

I have a search results to display from index action. Every individual record displays in the pop up through show action.

What I would love to do is to execute pop up if there is only one record found.

Here what I already tried.

def index
 @companies = Company.search(params[:query]).results
 @count = @companies.total
 if @count == 1
   return
   render company_path       
 end

end

Seems like return, redirect_to or render aren't play well in one action.

Any other thought of doing it?

UPDATE added show action

def show
 sleep 1/2
 client = Elasticsearch::Client.new host:'127.0.0.1:9200', log: true
 response = client.search index: 'companies', body: {query: { match: {_id: params[:id]} } }
 @company = response['hits']['hits'][0]['_source']
   respond_to do |format|
     format.html # show.html.erb
     format.js # show.js.erb
     format.json { render json: @company }
   end
  # more code 
end

Solution

  • The return is definitely killing you, but you're trying to render / redirect to a path for a specific resource without specifying the resource. I've taken a stab at something that might work a bit better for you:

    class MyController
      before_action :find_companies, only: :index
      before_action :find_company, only: :show
      before_action :show_company_if_matched, only: :index
    
      def index
        # do whatever you were doing here...
      end
    
      def show
        respond_to do |format|
          format.html # show.html.erb
          format.js # show.js.erb
          format.json { render json: @company }
        end
        # more code 
      end
    
      private
    
      def find_companies
        @companies = Company.search(params[:query]).results
      end
    
      def find_company
        client = Elasticsearch::Client.new host:'127.0.0.1:9200', log: true
        response = client.search index: 'companies', body: {query: { match: {_id: params[:id]} } }
        @company = response['hits']['hits'][0]['_source']
      end
    
      def show_company_if_matched
        redirect_to company_path(@comapnies.first) if @companies.total == 1
      end
    end
    

    EDIT: Updated to include show action