我有一个列出许多工作的网站,但我也希望每个帐户都能在一个地方访问其工作。因此,我正在使用这些路线:
map.resources :jobs
map.resource :account, :has_many => :jobs
这会为我提供localhost/jobs/
和localhost/account/jobs
等网址。但是,两者似乎都呈现JobsController::index
。如何在索引操作中创建条件(如何访问是否在URL中指定了帐户/作业或仅指定了作业?)或更改帐户路由以呈现不同的操作?这样做的正确方法是什么?
答案 0 :(得分:3)
您可以在创建路线时使用块,然后传递:controller
参数,如此
map.resource :account do |account|
# If you have a special controller 'AccountJobsController'
account.resources :jobs, :controller => "account_jobs"
end
将控制器放入目录结构中可能会更清晰,然后您可以以嵌套方式引用它们。例如:
map.resource :account do |account|
account.resources :jobs, :controller => "accounts/jobs"
end
如果使用上面的代码片段,则应在app / controllers / accounts / jobs_controller.rb中创建一个控制器,其定义如下:
class Account::JobsController < ApplicationController
##
## etc.
##
end
您始终可以使用rake routes
来检查已生成哪些路由以及他们将使用哪些控制器。
答案 1 :(得分:2)
向资源定义添加需求允许您传递额外参数
map.resources :jobs
map.resource :account, :has_many => :jobs, :requirements => {:account => true}
如果路由网址为“http://www.mysite.tld/account/jobs”,则会设置params[:account]
,如果路由网址为“http://www.mysite.tld/jobs”则会设置为{/ 1}
与所有其他restful路由一样,操作取决于上下文。
答案 2 :(得分:0)
如果您运行“rake routes”,您应该会看到类似这样的内容
account_jobs GET /accounts/:account_id/jobs/:job_id {:controller => 'jobs', :action => 'index'}
这意味着当您通过/ account / jobs路由调用您的操作时,您应该具有:account_id参数。然后,您可以根据此参数的存在来进行逻辑切换:
if params[:account_id].nil?
...
else
...
end