Ruby on Rails条件路由

时间:2009-11-18 18:43:02

标签: ruby-on-rails ruby routing

我有一个列出许多工作的网站,但我也希望每个帐户都能在一个地方访问其工作。因此,我正在使用这些路线:

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

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

3 个答案:

答案 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路由一样,操作取决于上下文。

  • 没有id路由的GET请求索引。
  • 使用ID路径GET请求显示
  • POST请求路由创建
  • PUT请求路由更新
  • DELETE请求路由销毁。

答案 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