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