Ruby on rails RubyonRails条件路由
我有一个网站列出了许多工作,但我也希望每个帐户能够访问一个地方的工作。因此,我使用这些路线:Ruby on rails RubyonRails条件路由,ruby-on-rails,ruby,routing,Ruby On Rails,Ruby,Routing,我有一个网站列出了许多工作,但我也希望每个帐户能够访问一个地方的工作。因此,我使用这些路线: map.resources :jobs map.resource :account, :has_many => :jobs 这会得到像localhost/jobs/和localhost/account/jobs这样的URL。但是,两者似乎都呈现JobsController::index。如何在索引操作中设置条件(如何访问URL中是否指定了帐户/作业或仅指定了作业?)或更改帐户路径以呈现不同的操作
map.resources :jobs
map.resource :account, :has_many => :jobs
这会得到像localhost/jobs/
和localhost/account/jobs
这样的URL。但是,两者似乎都呈现JobsController::index
。如何在索引操作中设置条件(如何访问URL中是否指定了帐户/作业或仅指定了作业?)或更改帐户路径以呈现不同的操作?这样做的正确方法是什么?如果您运行“rake routes”,您应该会看到类似的内容
account_jobs GET /accounts/:account_id/jobs/:job_id {:controller => 'jobs', :action => 'index'}
这意味着当通过/account/jobs路由调用您的操作时,您应该有一个:account\u id参数。然后,您可以根据此参数的存在进行逻辑切换:
if params[:account_id].nil?
...
else
...
end
如果您运行“rake路由”,您应该会看到类似的内容
account_jobs GET /accounts/:account_id/jobs/:job_id {:controller => 'jobs', :action => 'index'}
这意味着当通过/account/jobs路由调用您的操作时,您应该有一个:account\u id参数。然后,您可以根据此参数的存在进行逻辑切换:
if params[:account_id].nil?
...
else
...
end
向资源定义中添加需求允许您传递额外的参数
map.resources :jobs
map.resource :account, :has_many => :jobs, :requirements => {:account => true}
然后,如果路由url为“”,将设置参数[:account]
,如果为“”,则取消设置
与所有其他restful路由一样,操作取决于上下文
- 获取没有id路由的请求以进行索引
- 获取具有要显示的id路由的请求
- POST请求要创建的路由
- 将请求放入要更新的路由
- 删除要销毁的路由请求
map.resources :jobs
map.resource :account, :has_many => :jobs, :requirements => {:account => true}
然后,如果路由url为“”,将设置参数[:account]
,如果为“”,则取消设置
与所有其他restful路由一样,操作取决于上下文
- 获取没有id路由的请求以进行索引
- 获取具有要显示的id路由的请求
- POST请求要创建的路由
- 将请求放入要更新的路由
- 删除要销毁的路由请求
: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\u controller.rb中创建一个控制器,其定义如下:
class Account::JobsController < ApplicationController
##
## etc.
##
end
类帐户::作业控制器
您可以始终使用
rake routes
检查已生成哪些路由以及它们将使用哪些控制器。您可以在创建路由时使用块,然后传递: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\u controller.rb中创建一个控制器,其定义如下:
class Account::JobsController < ApplicationController
##
## etc.
##
end
类帐户::作业控制器
您可以始终使用
rake routes
来检查已生成哪些路由以及它们将使用哪些控制器。我刚刚在一个clean rails项目上这样做是为了验证,是的,它确实以这种方式工作。routes.rb:ActionController::Routing::routes.draw do | map | map.resources:jobs map.resources:accounts,:has_many=>:jobs“rake routes”account_jobs GET/accounts/:account_id/jobs(:format){:controller=>“jobs”,:action=>“index”}从日志获取:处理作业控制器#索引(对于127.0.0.1 at 2009-11-18 11:24:22)[GET]参数:{“account_id”=>“123”}Yikes,很抱歉(非)格式化。我的观点是……这种方式是什么意思在你的评论中?这个问题用map.resource将account指定为一个资源。这意味着只有一个资源。你提到的路线并不是为有很多资源的资源创建的。但是如果account是用map.resources.Ah定义的,那就应该是这样的。你完全正确;我完全没有意识到这是资源在e问题。“每个帐户”这一点让我很反感。我只是在一个干净的rails项目上做了这一点来验证,是的,它确实是这样工作的。routes.rb:ActionController::Routing::routes.draw do | map | map.resources:jobs map.resources:accounts,:has_many=>:jobs“rake routes”account\u jobs GET/accounts/:account\u id/jobs(:format){:controller=>“jobs”,:action=>“index”}从log:Processing JobsController#index(在2009-11-18 11:24:22的127.0.0.1版本中)[get]参数:{“account_id=>“123”}Yikes,很抱歉(非)格式设置。我的观点是……这种方式是什么意思在你的评论中?这个问题用map.resource将account指定为一个资源。这意味着只有一个资源。你提到的路线并不是为有很多资源的资源创建的。但是如果account是用map.resources.Ah定义的,那就应该是这样的。你完全正确;我完全没有意识到这是资源在e问题。“每个帐户”一字让我很困惑。你有一个或多个帐户吗?声明“我也想要每个帐户…”表示多个,但“map.resource:account”表示一个。你有一个或多个帐户吗?声明“我也想要每个帐户…”表示多个,但“map.resource:account”表示一个。