在资源中明确声明Controller时如何避免名称空间

时间:2012-09-18 11:22:49

标签: 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/items/:item_id/assets/index(.:format)
controller: admin/site/assets#index

如果我试图明确地预先指出controller,就像这样:

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

我想要这种行为,因为我有一个AssetsController负责操纵我的应用程序中Assets的{​​{1}}。并且有几个名称空间但我希望Models保留在lowerst中。

3 个答案:

答案 0 :(得分:1)

我不认为嵌套资源声明可能是您想要的。这是另一个尝试的选择:

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

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

(请参阅http://guides.rubyonrails.org/routing.html#controller-namespaces-and-routinghttp://api.rubyonrails.org/classes/ActionDispatch/Routing.html

答案 1 :(得分:0)

尝试怎么样:

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

告诉我这对你有什么影响

答案 2 :(得分:0)

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

# 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 看起来像我喜欢。

此方法的唯一问题是路由的名称正在丢失 site 前缀:

admin_site_item_assets => admin_item_assets

我尝试使用:as => "site_items"资源中的items选项,但这会更改 url 本身:

/admin/site/items/:item_id/assets(.:format) => /admin/site/items/:site_item_id/assets(.:format)

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