2009-03-03 188 views
2

我正在使用map.resourcesmap.resource设置Rails站点,并遇到了限制(据我所知至少)。路由资源的问题

这是我目前的路由。

map.with_options :conditions => { :subdomain => true } do |sub| 
    sub.root :controller => 'company' 

    sub.resource :company do |company| 
    company.resources :clients, :path_prefix => nil, :name_prefix => nil, :collection => { :sort => :post } do |clients| 
     clients.resources :projects, :path_prefix => ":client/:project" 
    end 
    end 

    sub.resource :user, :collection => { :logout => :get } 
end 

在一般意义上,这是我想要的结果:
/客户名称/动作
调用客户端控制器,并通过客户端名称作为某种散列是相同的。

/客户名称/项目名称/操作
调用Projects控制器,但传递客户端名称作为散列保持不变。它想通过它作为一个id。

我希望能保持我的URL结构很基本的,所以:

  1. 客户名称=雅虎
  2. 项目名称=登录页

/客户名称/ - 这应该使用Clients.show方法。
/client-name/edit - 这应该使用Clients.edit方法。
/client-name/project-name - 这应该使用Projects.show方法。
/客户名称/项目名称/编辑 - 这应该使用Projects.edit方法。

虽然我目前的路由它被解释成:
/客户名称/项目 - 这是使用Projects.index方法。
/clients/client-name - 这是使用Clients.show方法。


我真的很感谢任何帮助。

+0

我试图解开您的问题,但我陷入了困境试图弄清楚“某种散列是相同的”意味着什么。 – jdl 2009-03-03 16:44:24

+0

我想要包含可以使用的before_filter方法,所以它需要能够读取,params [:client]或params [:project]来拉动它们的slu。。你现在明白了么?如果你喜欢,我可以向你展示一个例子。 – Garrett 2009-03-03 22:20:03

回答

1

资源映射并不那么强大。此外,它还在URI中添加资源(公司,项目等)的名称。可能仍然有一种方法可以实现您尝试使用资源映射的方法,但我认为使用常规映射更容易:

map.connect ':client',  :controller => 'clients', :action => 'show' 
map.connect ':client/edit', :controller => 'clients', :action => 'edit' 

map.connect ':client/:project',  :controller => 'projects', :action => 'show' 
map.connect ':client/:project/edit', :controller => 'projects', :action => 'edit'