klausinho
klausinho

Reputation: 301

How can I call different controllers from routes.rb

I'm just struggling a few hours with a problem, that seems rather easy, but not for me and not for google :)

I put some routes via

scope :path => '/:mandate_key', :controller => :tasks do
  get   '/'          =>  :index        #mandate_path
  match '/import'    => "import#index"
  match '/clearance' => "clearance#index"
end

So far, so ugly! I'm looking for a way to call different controllers (import and clearance) dependent on the second param. Something like this:

scope :path => '/:mandate_key', :controller => :tasks do
  get '/' =>  :index  
  scope :path => ':task_key', :controller => %{'task_key'}
    get '/' => :index
  end
end

where :task_key should be recognized as params[:task_key] and the called controller should be the value of params[:task_key]

So if a click a link like http://some.url/a_mandate_key/import it should call the ImportController.

I'm sure that the solution will be simple, but finding is hard!

Upvotes: 2

Views: 290

Answers (2)

klausinho
klausinho

Reputation: 301

Sometimes one is looking for a highly complicated solution, but it could be so much easier:

scope :path => '/:mandate_key' do
  get '/'           => "tasks#index"        #mandate_path
  get '/import'     => "import#index"
  get '/clearance'  => "clearance#index"
end

Calling http://localhost/mandate the controller 'mandate' is called an params[:mandate_key] provides 'mandate'

Calling http://localhost/mandate/import the controller 'import' is called an params[:controller] provides 'import'

Trying the easy way is often the best way :)

Thanks for your help, Bohdan!

Upvotes: 2

Bohdan
Bohdan

Reputation: 8408

you might add in the bottom of your routes match ':controller(/:action(/:id))' so any unknown url will be dispatched this way

How about

scope :path => '/:mandate_key', :controller => :tasks do
  get '/'            =>  :index        #mandate_path
end
....
match ':mandate_key/:controller(/:action)'

first scope will match routes /:mandate_key/tasks and the second one /:mandate_key/:controller or /:mandate_key/:controller/:action however second part should be defined in the bottom of your routes.rb file otherwise it'll match wrong routes

Upvotes: 1

Related Questions