命名空间控制器&嵌套资源

时间:2013-02-22 03:47:10

标签: ruby-on-rails architecture namespace-organisation

使用名称间距嵌套资源是否是一个糟糕的主意?

我想要一个管理区域,其中包含一堆控制器。该区域中的某些资源可以嵌套,例如:

resources :suppliers do
  resources :products   
  resources :locations
end

虽然名字空间如下:

 map.namespace :admin do |admin|
  resources :suppliers do
    resources :products 
    resources :locations
  end
 end

在像这样的命名空间中使用嵌套是否可能/一个好主意?我应该如何构建事物?

1 个答案:

答案 0 :(得分:1)

命名空间管理区域是一个好主意,因为它使这些控制器与面向公共/用户的控制器分开。这里的重大胜利是安全性,因为您的管理员操作可能会做得更多,并可能绕过某些安全限制,例如删除或限制授权数量,具体取决于您希望如何构建管理访问权限。

对于嵌套资源,如果有意义则使用它。如果您从不想在其父资源的上下文之外访问其中一个嵌套资源,那么使用嵌套资源是一个不错的选择。

例如,如果供应商要访问您的管理界面,并且每个管理员的范围仅限于其资源,那么它可能使授权更简单,因为您可以简单地查询该嵌套资源和您的授权简化为检查其帐户是否与该供应商相关联。

class Admin::ProductsController < AdminController
  before_filter :load_supplier

  # your actions

  def load_supplier
    # Will trigger a 404 if the supplier does not belong to the admin
    @supplier = current_admin.suppliers.find(params[:supplier_id])
  end
end

当然,这取决于你想要完成什么,管理区域的预期受众是什么,他们是否可以完全访问所有内容。如果是这样,他们需要访问任何关系背景之外的资源。例如,如果我是管理员,我需要对所有产品进行搜索/排序/过滤,无论供应商(或者可能由一个或多个供应商过滤),然后从这些限制生成CSV / Excel 。在这种情况下,使用嵌套资源可能会使这很困难或不可能。

我个人发现嵌套资源在面向用户/公众的控制器中更有意义,并且在管理区域更加烦人,但是我总是构建仅限于少数人的管理界面。在这种情况下,我通常会转向像ActiveAdmin这样的宝石,它基本上为每个模型提供了完整的CRUD,并提供了大量的自定义选项。