如何从routes.rb调用不同的控制器

时间:2011-07-13 18:17:22

标签: ruby-on-rails-3 routes

我只是在几个小时内遇到问题,这似乎相当容易,但对我而言并不适合谷歌:)

我通过

放了一些路线
scope :path => '/:mandate_key', :controller => :tasks do
  get   '/'          =>  :index        #mandate_path
  match '/import'    => "import#index"
  match '/clearance' => "clearance#index"
end

到目前为止,太丑了!我正在寻找一种方法来调用不同的控制器(导入和清除)依赖于第二个参数。像这样:

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

其中:task_key应被识别为params[:task_key],被叫控制器应为params[:task_key]的值

因此,如果点击http://some.url/a_mandate_key/import之类的链接,则应调用ImportController

我确信解决方案很简单,但发现很难!

2 个答案:

答案 0 :(得分:2)

有时人们正在寻找一个非常复杂的解决方案,但它可能会更容易:

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

调用http://localhost/mandate控制器'授权'被称为params [:mand_key]提供'授权'

调用http://localhost/mandate/import控制器'import'被称为params [:controller]提供'import'

尝试简单的方法通常是最好的方法:)

感谢您的帮助,Bohdan!

答案 1 :(得分:1)

您可以在路线match ':controller(/:action(/:id))'的底部添加,以便以这种方式调度任何未知的网址

怎么样

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

第一个范围将匹配路由/:mandate_key/tasks,第二个范围匹配/:mandate_key/:controller/:mandate_key/:controller/:action但是第二部分应该在routes.rb文件的底部定义,否则它将匹配错误的路线