如何在Rails 4中使用路由器控制进出命名空间

时间:2014-08-29 20:58:11

标签: ruby-on-rails ruby-on-rails-4 namespaces

我是Rails的新手,有点混淆命名空间的工作原理。基本上我有类别和客户控制器。

我想创建一个管理命名空间(我还不了解)所以某些方法只能通过/admin/products/id, via: 'delete'/admin/...是重要部分)命名空间来访问,而其他方法会被访问通常是这样的:/products, via: 'get'

如果我理解正确,为了创建一个命名空间,我需要创建一个子目录并将控制器放在这个目录中,但我想在这种情况下它将无法正常访问?

这可能吗?怎么样?

我试过(例如)

match '/admin/products',    to: 'admin#index', via: 'get'

但它给了我一个错误,说变量(在模板中)不可用。但是,当我尝试没有/admin它工作正常,这意味着问题是名称空间情况。

2 个答案:

答案 0 :(得分:2)

如果您将以下命名空间添加到route.rb

namespace :admin do
  resources : categories
  resources : customers
end

您可以在controllers/admin文件夹中创建以下控制器:

#base_controller.rb - will work like your application_controller for the namespace
class Admin::BaseController < ActionController::Base
  ...
end

#categories_controller.rb - will work like your categories_controller for the namespace
class Admin::CategoriesController < Admin::BaseController
  ...
end

#customers_controller.rb - will work like your customers_controller for the namespace
class Admin::CustomersController < Admin::BaseController
  ...
end

通过这种方式,您可以在基本控制器中添加身份验证,为管理员提供完全访问权限,并从非命名空间部分中删除deleteedit等操作。

我希望它有所帮助...

答案 1 :(得分:0)

namespace是控制器模块的等价物。

简单地说,您必须执行以下操作:

  
      
  • 将命名空间控制器放入同名的子目录
  •   
  • 您的所有路线都需要通过命名空间帮助
  • 发送   

以下是如何执行此操作:


<强>命名空间

通过阅读namespacing from the Rails documents

,您将处于最佳位置

如果你想创建一个“admin”命名空间,你可以执行以下操作(我们使用它):

#config/routes.rb
namespace :admin do
   root "products#index"

   resources :products, only: [:new, :create]
   resources :customers, only: [:new, :create]
end

resources :products, only: [:index, :show]
resources :customers, only: [:index, :show]

这将为您创建多条路线;但命名空间的只会提供

以下是构建控制器的方法:

#app/controllers/admin/application_controller.rb
class Admin::ApplicationController < ActionController::Base
   before_action :authenticate_user!
end

#app/controllers/admin/products_controller.rb
class Admin::ProductsController < Admin::ApplicationController
   def index
      @products = Product.all
   end
end

这将为您提供仅限身份验证的区域,以便访问ProductCategory个对象的创建。

如果要路由到这些控制器,则需要使用提供的命名空间路由:

<%= link_to "New Product", admin_product_path if user_signed_in? %>