2009-11-18 114 views
1

我有一个网站列出了许多作业,但我也希望每个帐户都能够在一个地方访问它的作业。因此,我用这些路线:Ruby on Rails有条件路由

map.resources :jobs 
map.resource :account, :has_many => :jobs 

这让我像localhost/jobs/localhost/account/jobs网址。但是,两者似乎都呈现JobsController::index。我如何在索引操作中创建条件(如何访问是否在URL中指定了帐户/作业或只是作业?)或更改帐户路由以呈现不同的操作?什么是正确的方法来做到这一点?

+0

你有一个或多个帐户?声明“我也想要每个帐户......”提示多个,但“map.resource:account”暗示了一个。 – avaynshtok 2009-11-18 21:18:25

回答

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 

如果使用上面的代码中,你应该再创建应用程序/控制器/帐号/ jobs_controller.rb控制器,它是像这样定义:

class Account::JobsController < ApplicationController 
    ## 
    ## etc. 
    ## 
end 

您可以随时使用rake routes来检查哪些路由已经生成以及他们将使用哪些控制器。

+0

这是一个很好的答案! – 2009-11-18 20:45:05

0

如果你运行“耙路线”,你应该看到这样的事情

account_jobs GET /accounts/:account_id/jobs/:job_id {:controller => 'jobs', :action => 'index'} 

这意味着当你的行动是通过/帐号/工作路线,你应该有一个叫:ACCOUNT_ID参数。那么你可以做基于此参数的时存在的逻辑开关:

if params[:account_id].nil? 
    ... 
else 
    ... 
end 
+0

map.resource不能以这种方式工作。 – EmFi 2009-11-18 19:05:36

+0

我只是在一个干净的rails项目上做了这个验证,而且是的,它的确可以这样工作。 routes.rb: ActionController :: Routing :: Routes.draw do | map | map.resources:工作 地图。资源:账户,:的has_many =>:作业 “耙路线” account_jobs GET /accounts/:account_id/jobs(.:format){:控制器=> “工作”,:动作=> “索引”} 获取http:// localhost:3000/accounts/123/jobs from日志: 处理JobsController#索引(对于127.0.0.1,2009-11-18 11:24:22)[GET] 参数:{“account_id” =>“123”} – avaynshtok 2009-11-18 19:26:00

+0

哎呀,对不起(非)格式。我的观点是......你评论中“这种方式”的含义是什么? – avaynshtok 2009-11-18 19:30:38

2

添加要求,资源定义可以让你额外的参数传递

map.resources :jobs 
map.resource :account, :has_many => :jobs, :requirements => {:account => true} 

然后params[:account]如果路由将被设置url为'http://www.mysite.tld/account/jobs',如果它是'http://www.mysite.tld/jobs',则取消设置'

与其他所有安静路由一样,操作取决于上下文。

  • GET请求没有id路由到索引。
  • 与ID路线GET请求来显示
  • POST请求路由创建
  • PUT请求路由更新
  • DELETE请求路由给毁了。