【问题标题】:Two modules with same method names included in same class同一类中包含具有相同方法名称的两个模块
【发布时间】:2018-12-21 23:08:55
【问题描述】:

我正在使用 ruby​​ on rails 并且我基本上试图将两个模块包含到同一个模型/类中,两个模块具有相同的方法名称。下面将演示一个示例,但是我的问题是:

有没有办法有条件地包含模块?要么 有没有办法根据类的具体实例来调用。

一个简单的完整配置文件向导就是一个例子。

它的工作原理

案例 1:如果用户是 Transporter,当用户有 company_name 时,step_one 完成。

案例 2:另一方面,如果用户是客户,则 step_one 在用户有电话时完成。

class User < ApplicationRecord
  include ClientWizard
  include TransporterWizard
end

module ClientWizard
 def step_one_completed?
  self.name.present?
 end
end

module TransporterWizard
 def step_one_completed?
  self.company_name.present?
 end
end

【问题讨论】:

    标签: ruby-on-rails ruby module


    【解决方案1】:

    不,模块方法都存在于类的命名空间中。因此,这似乎不是一个特别好的模块用例。

    您可以为方法指定特定于模块的名称 (client_wizard_step_one_completed?),但我建议将向导定义为单独的类,并将用户实例作为参数传递。

    class User < ApplicationRecord
      def client_wizard
        ClientWizard.new(self)
      end
    end
    
    class ClientWizard
      def initialize(user)
        @user = user
      end
    
      def step_one_completed?
        @user.name.present?
      end
    end
    

    【讨论】:

    • 这看起来很棒!非常感谢。几个问题:我想我可以封装(如果我使用错误的术语,命名空间)这两个类。另外我如何分享常用方法。再次感谢您。
    • 是的,您可以在方便的地方定义这些类。您可以通过继承(可能是 ClientWizard
    猜你喜欢
    • 2013-01-21
    • 2020-03-20
    • 2017-07-03
    • 1970-01-01
    • 2014-04-21
    • 2013-12-03
    • 2011-07-02
    • 2020-03-30
    • 1970-01-01
    相关资源
    最近更新 更多