JudgeProphet
JudgeProphet

Reputation: 1729

RAILS: Rendering views from the same controller based on the route

I have two routes (defined in my config/routes.rb)

match 'compare'     => 'front_office#search_by_id', :via => :get, :as => :front_office_compare
match 'full_report' => 'front_office#search_by_id', :via => :get, :as => :front_office_full_report

I would like to know how I can tell my controller to render the view based on my route, without adding a parameter on my URL.

Based on this Question&Answer I Managed to get the result I want with

match 'compare'     => 'front_office#search_by_id', :via => :get, :as => :front_office_compare,     :defaults => { :render => 'compare' }
match 'full_report' => 'front_office#search_by_id', :via => :get, :as => :front_office_full_report, :defaults => { :render => 'full_report' }

And in my controller I defined my action as:

  def search_by_id
    render :action => (params[:render] || "full_report")
  end

But is this a Good Practice or is there a better way to do it?

Upvotes: 0

Views: 179

Answers (1)

Vishal Taj PM
Vishal Taj PM

Reputation: 1359

Instead of creating different routes for each category you are making for simplifying you can write it like:

# config/routes.rb 

get ":category", to: "front_office#search_by_id", as: 'front_office', constraints: {category: /(compare|full_report)/}

the above routes looks for /compare and /full_report and this will call search_by_id action in front_office controller.

then inside the controller do as follows:

def search_by_id
  render params[:category]
end

params[:category] will hold the slug values which we passed through the URL

Upvotes: 1

Related Questions