为管理区域命名空间是一个好主意,因为它使这些控制器与您的公共/面向用户的控制器分开。这里最大的胜利是安全性,因为您的管理员操作可能能够执行更多操作,并且可能会绕过某些安全限制,例如删除或限制授权量,具体取决于您希望如何构建管理访问权限。
至于嵌套资源,如果有意义就使用它。如果您从不想访问其父资源上下文之外的嵌套资源之一,那么使用嵌套资源是一个不错的选择。
例如,如果供应商可以访问您的管理界面,并且每个管理员的范围仅限于他们的资源,那么嵌套资源可能会使授权更简单,因为您可以简单地通过该嵌套资源进行查询,并且您的授权是简化为检查他们的帐户是否与该供应商相关联。
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 这样的 gem,它基本上为您提供每个模型的完整 CRUD,并提供大量自定义选项。