【问题标题】:DRYing up Inherited Methods in Rails Controllers干掉 Rails 控制器中的继承方法
【发布时间】:2015-08-05 17:50:05
【问题描述】:

我有一组基本的控制器和一组非常标准的 RESTful 方法。然后我有第二组控制器用于管理客户端微型站点。第二组控制器几乎与基本组相同,只是每个响应 HTML 的方法都需要定义一个额外的实例变量来表示微站点的 id(基本控制器不可用)。

这意味着我在我的应用程序中重复了我的代码两次,这不是很容易维护,尤其是对于具有许多控制器的大型应用程序。有没有办法告诉控制器继承一个方法,然后在继承的方法中插入一个额外的变量或其他逻辑?

例如,如果我在下面有一个 UsersController:

class UsersController < ApplicationController
    def index
    end
end

然后我有 Clients::UsersController

class Clients::UsersController < UsersController
    def index
        @client_id = params[:id]
    end
end

我怎样才能干掉 Clients::UsersController?

【问题讨论】:

  • 很难告诉你任何有用的信息,因为你已经省略了所有相关的代码。此时,我们可以建议“将lots of flow control 放入一个方法中”,仅此而已。
  • 代码不是很相关。这不是关于特定代码的问题。这是一个关于设计模式的问题。我可以发布我的控制器的所有代码,但其中 99% 与问题无关,这就是我选择通用示例的原因。

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 inheritance model-view-controller


【解决方案1】:

您可能正在寻找concern

# app/controllers/concerns/do_something.rb

module DoSomething
  include ActiveSupport::Concern

  def something
    # Shared code goes here
  end
end

在您的控制器中...

class UsersController < ApplicationController
    include DoSomething

    def index
      # Invoke shared code
      something
    end
end

class Clients::UsersController < UsersController
    include DoSomething

    def index
      @client_id = params[:id]

      # Invoke shared code
      something
    end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多