1

同时使用名称间距和嵌套资源是一个糟糕的主意吗?

我想要一个管理区域,里面有一堆控制器。该区域的一些资源可以嵌套,例如:

resources :suppliers do
  resources :products   
  resources :locations
end

虽然像这样命名空间:

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

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

4

1 回答 1

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 这样的 gem,它基本上为您提供每个模型的完整 CRUD,并提供大量自定义选项。

于 2013-02-22T07:44:25.707 回答