【问题标题】:Namespaced ApplicationController in RailsRails 中的命名空间应用程序控制器
【发布时间】:2011-01-21 15:16:19
【问题描述】:

我有我的常规 ApplicationController 类和我有一个 Admin::ApplicationController 类。问题是 Admin::ApplicationController 似乎没有被加载或执行或任何东西。我不允许有命名空间的应用程序控制器吗?想要拥有它的原因是,我可以检查用户是否是带有 CanCan 的管理员,如果不是,则将他们重定向出去。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3


    【解决方案1】:

    将此控制器称为Admin::BaseController,因为它更多地充当命名空间的基础,而不是为应用程序做任何事情。为了让它做你想做的事,你需要让所有管理命名空间的控制器都继承自这个控制器。

    【讨论】:

    • 嗨 Ryan,有机会解释一下为什么要重命名控制器吗?只是想知道,因为我确实有一个功能正常的 Admin::ApplicationController 工作得很好。这不就是命名空间的意义吗?
    • 虽然它不是一个 ApplicationController。它是命名空间的 base,其他任何地方都继承自该命名空间。我这样做的原因主要是因为它是我们在模型中继承的ActiveRecord::Base。只是有点一致性。
    • 谢谢。在我的应用程序中,一致性是相反的。 Admin::ApplicationController 继承自 ActionController::Base。出于所有意图和目的,/admin 是主应用程序内的一个单独应用程序,在过滤之前拥有它自己的一切。它对我来说效果很好。
    【解决方案2】:

    我见过这样的命名空间的唯一一次是控制器嵌套在子文件夹中。所以 Admin::ApplicationController 应该在 controllers/admin/application_controller.rb 中

    一种可能的解决方案:

    如果您希望除主页之外的所有内容都将它们踢出,只需在应用程序控制器上设置一个 before_filter,但 home/index 除外,如下所示:

    ApplicationController.rb

    before_filter :authorize_admin
    
    def authorize_admin
       //dostuff
    end
    

    HomeController.rb

    skip_before_filter :authorize_admin, :only => ['index']
    

    其中 index 是您要跳过的操作。离开唯一跳过整个控制器的过滤器。

    【讨论】:

    • 我同意在before_filter 中使用授权方法会更简单。使用命名空间对我来说似乎是不必要的复杂化。
    猜你喜欢
    • 2014-05-19
    • 2017-01-18
    • 2023-03-11
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 2010-11-26
    相关资源
    最近更新 更多