【问题标题】:Can rails controllers be inherited to a third level deep?Rails 控制器可以继承到第三层吗?
【发布时间】:2013-05-10 05:26:40
【问题描述】:

我可以在 Rails 中拥有 3 级深度继承的控制器吗?有人会认为这样一件微不足道的事情是可能的,但是“第三”级别的具体控制器给出了“未初始化常量 Ns2::SecondController”的通用/无用错误

基本上就是这个代码(我没有试过这个确切的代码)

module Ns3
  class ThirdController < Ns2::SecondController
  end
end

module Ns2
  class SecondController< Ns1::FirstController
  end
end

module Ns1
  class FirstController< ApplicationController
  end
end

注意:在路由和所有此类目录中使用命名空间应正确设置。

我确信我可以重新安排逻辑并使用 mixins 或 helpers 获得一些东西。但是,为了我自己的利益,我希望立即回答这个问题。是/否或方式通过了错误。对重构变通解决方案 ATM 不感兴趣。虽然我猜它不会受伤。

谢谢

【问题讨论】:

  • 你的控制器的磁盘布局是什么
  • 所有显示的命名空间都符合所需的语法。上面是一个例子,我显然没有这些名字。我可以深入两个没有问题,第三个似乎是一个问题。

标签: ruby-on-rails ruby model-view-controller controllers


【解决方案1】:

很可能是类名或文件名中的拼写错误。

您需要将类放在正确的文件/目录结构中,以便 Rails 自动加载工作,例如:

#/controllers/ns3/third_controller.rb
module Ns3
  class ThirdController < Ns2::SecondController
  end
end

#/controllers/ns2/second_controller.rb
module Ns2
  class SecondController < Ns1::FirstController
  end
end

#/controllers/ns1/first_controller.rb
module Ns1
  class FirstController < ApplicationController
  end
end

要尝试的另一件事是从根命名空间开始范围,因此使用 :: 前缀,如下所示:

module Ns1
  class SecondController < ::Ns1::FirstController
  end
end

你也可以试试这个:

#/controllers/ns3/third_controller.rb
class Ns3::ThirdController < ::Ns2::SecondController
end

【讨论】:

    【解决方案2】:

    这是可以做到的。

    然而,RoR 看起来很奇怪,您必须为基类隐式指定命名空间。如果你让它默认为当前命名空间,它的行为会很奇怪。

    【讨论】:

      猜你喜欢
      • 2020-01-17
      • 1970-01-01
      • 2013-08-29
      • 2011-07-11
      • 2015-09-27
      • 1970-01-01
      • 1970-01-01
      • 2011-03-04
      • 1970-01-01
      相关资源
      最近更新 更多