我是Rails的新手,有点混淆命名空间的工作原理。基本上我有类别和客户控制器。
我想创建一个管理命名空间(我还不了解)所以某些方法只能通过/admin/products/id, via: 'delete'
(/admin/...
是重要部分)命名空间来访问,而其他方法会被访问通常是这样的:/products, via: 'get'
如果我理解正确,为了创建一个命名空间,我需要创建一个子目录并将控制器放在这个目录中,但我想在这种情况下它将无法正常访问?
这可能吗?怎么样?
我试过(例如)
match '/admin/products', to: 'admin#index', via: 'get'
但它给了我一个错误,说变量(在模板中)不可用。但是,当我尝试没有/admin
它工作正常,这意味着问题是名称空间情况。
答案 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
通过这种方式,您可以在基本控制器中添加身份验证,为管理员提供完全访问权限,并从非命名空间部分中删除delete
,edit
等操作。
我希望它有所帮助...
答案 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
这将为您提供仅限身份验证的区域,以便访问Product
和Category
个对象的创建。
如果要路由到这些控制器,则需要使用提供的命名空间路由:
<%= link_to "New Product", admin_product_path if user_signed_in? %>