【问题标题】:Inherit from multiple controllers.从多个控制器继承。
【发布时间】:2013-08-06 10:06:52
【问题描述】:

我使用 Rails 引擎作为cms。一切正常。我正在为此添加设计。

我生成的设计控制器继承自 Devise::SessionsController。但是有一些过滤器是从引擎中的另一个控制器运行的,在这种情况下不会运行。许多网站都依赖于这些正在运行的过滤器。当然我可以复制它们,但那是糟糕的juju。

所以我的问题是:如何让一个控制器运行另一个控制器的过滤器?我不想编辑任何一个 gem。

【问题讨论】:

  • 不确定你在做什么。但这不会起作用吗? github.com/comfy/comfortable-mexican-sofa/wiki/…
  • 嘿@Grocery 我猜你是舒适的创造者?如果是这样,这就是我正在做的事情:我已经对你的 gem 进行了相当多的修改(你可能实际上想要它的一些功能)并正在使用它构建一个应用程序。我想要前端的用户登录系统。我已将其用于身份验证。但是对于设计视图,它们需要实际的布局。我们的应用布局极简,该应用将包含许多完全可定制的网站。
  • 所以要做到这一点,我需要将舒适的功能混合到应用程序的设计控制器中。我最终将RenderMethods 包含在我的设计控制器中,重写了一些设计函数以使它们使用 cms_layouts(以及我们的一些功能)来使其工作。如果你想看就给我喊一声,事实上我会很高兴看到它的另一双眼睛。

标签: ruby-on-rails ruby-on-rails-3 inheritance devise mixins


【解决方案1】:

Devise 还有另一个选项:config.parent_controller。它默认为ApplicationController,但可以更改为其他内容。就我而言(Rails API),我使用ApiController。在config/initializers/devise.rb:

Devise.setup do |config| # ... other configuration options config.parent_controller = 'ApiController' end

【讨论】:

    【解决方案2】:

    Ruby 不支持多重继承。我认为将过滤器提取到一个模块中并将它们混合将是最干净的解决方案。

    例如: http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_modules.html

    【讨论】:

    • 所以我必须将它们添加到 mixin 中,然后将其包含到设计控制器中,并将它们保存在 gem 中。我不确定您所说的“提取”是什么意思
    • 是的,我的意思是摘录:采用您的过滤器方法并将它们放入模块中。然后将此模块包含在引擎的控制器和会话控制器中。
    • 我希望我不必修改任何一个 gem。还有其他方法吗?
    • 如我所说,不支持多重继承。如果您不想修改 gem,则必须复制代码...
    猜你喜欢
    • 2013-02-20
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多