Ruby on rails 在资源中显式声明控制器时如何避免名称空间

Ruby on rails 在资源中显式声明控制器时如何避免名称空间,ruby-on-rails,ruby-on-rails-3,routes,Ruby On Rails,Ruby On Rails 3,Routes,我想: url: /admin/site/items/:item_id/assets/index(.:format) controller: admin/assets#index 如果我以简单的方式声明路线: namespace :admin do namespace :site do resources :items do resources :assets end end end 我获得下一个路由/控制器连接: url: /admin/site/it

我想:

url: /admin/site/items/:item_id/assets/index(.:format) 
controller: admin/assets#index
如果我以简单的方式声明路线:

namespace :admin do
  namespace :site do
    resources :items do
      resources :assets
    end
  end
end
我获得下一个路由/控制器连接:

url: /admin/site/items/:item_id/assets/index(.:format)
controller: admin/site/assets#index
如果我试图以如下方式明确说明
控制器

namespace :admin do
  namespace :site do
    resources :items do
      resources :assets, :controller => "admin/assets"
    end
  end
end
然后我得到这个:

url: /admin/site/items/:item_id/assets/index(.:format) 
controller: admin/site/admin/assets#index
我还尝试像这样在控制器的路由中添加一个初始的
/

resources :assets, :controller => "/admin/assets"
但更糟糕的是:

url: /admin/site/items/:item_id/assets/index(.:format) 
controller: admin/site//admin/assets#index
我想要这种行为,因为我有一个
assetcontroller
,负责在我的应用程序中操纵不同
模型的
资产。有几个名称空间,但我希望
assetcontroller
保持在最下面的名称空间中。

试试看:

namespace :admin do
  scope :module => "site" do
    resources :items do
      resources :assets
    end
  end
end

告诉我这对您的效果如何

我找到了一种将路由拆分为两个块的解决方法,一个用于主资源
项的路由
,另一个用于嵌套资源
资产

# routes for the main resource
namespace :admin do
  namespace :site do
    resources :items
  end
end

# routes for the nested resource
namespace :admin do
  resources :items, :only => [], :path => "/site/items"
    resources :assets
  end
end
查看我如何通过
:only=>[]
,以避免在第二个块中创建默认路由

通过
:path
选项,我将获得我喜欢的url

这种方法的唯一问题是路线名称丢失了站点前缀:

我尝试使用
项目
资源中的
:as=>“site\u items”
选项,但这会更改url本身:


url对我来说比路由名称更重要。

我认为嵌套资源声明不可能满足您的需求。下面是另一个可以尝试的选项:

namespace :admin do
  namespace :site do
    resources :items
  end

  scope "/site/items/:item_id" do
    resources :assets, :as => "site_item_assets"
  end
end

(请参阅或)

唯一随此更改的是路线的名称,而不是
管理站点项目资产
我有
管理项目资产
。url和控制器保持不变。您可以为资源
资产
/admin/site/items/:item\u id/assets(:format)获取正确的url/控制器=>管理员/资产#索引
但是您丢失了资源
的正确控制器,现在的目标是
admin/items#索引
,而不是正确的
admin/site/items#index
。啊,我没有意识到项控制器是命名的。上面编辑了我的建议。现在两个控制器的名称空间都是
admin/site/assets#index
admin/site/items#index
是的,我不确定这是否可行。我认为你试图做的事情超出了rails的惯例;您需要使用两个不同的块。我会给你另一个选择上面,在编辑它的作品!,我刚刚编辑了您的答案,添加了一个合适的url名称,因为如果没有,它将只是
管理资源
,并且由于有多个主要资源,我必须按资源区分url。
/admin/site/items/:item_id/assets(.:format) => /admin/site/items/:site_item_id/assets(.:format)
namespace :admin do
  namespace :site do
    resources :items
  end

  scope "/site/items/:item_id" do
    resources :assets, :as => "site_item_assets"
  end
end