Comment puis-je inclure un Module dans un autre Module (Refactor AASM code et custom states dans le Module)

j'essaie de reformuler un modèle superfat qui a pas mal de lignes de code Actsastatemachine en relation avec les États et les transitions, et j'espérais reformuler ceci en un module CallStates.

#in lib/CallStates.rb
module CallStates
    module ClassMethods
        aasm_column :status
        aasm_state :state1
        aasm_state :state2
        aasm_state :state3
    end

    def self.included(base)
        base.send(:include, AASM)
        base.extend(ClassMethods)
    end
end

puis, dans le modèle

include CallStates

ma question porte sur la façon d'inclure le comportement du Module dans un Module de façon à ce qu'un seul Module puisse être inclus dans le modèle. J'ai essayé class_eval faire aussi bien en vain. Merci pour toutes les pensées perspicaces vous avoir sur cette question.

25
demandé sur edgerunner 2011-02-06 20:29:44
la source

4 ответов

Vous ne pouvez pas inclure un module dans un autre exactement, mais vous pouvez dire à un module d'inclure d'autres modules dans la classe dans laquelle il est inclus:

module Bmodule
  def greet
    puts 'hello world'
  end
end

module Amodule
  def self.included klass
    klass.class_eval do
      include Bmodule
    end
  end
end

class MyClass
  include Amodule
end

MyClass.new.greet # => hello world

il est préférable de le faire seulement si Bmodule est en fait des données qui sont nécessaires pour que Amodule fonctionne, sinon il peut conduire à la confusion parce qu'il n'est pas explicitement inclus dans MyClass.

37
répondu Pan Thomakos 2012-01-18 09:55:37
la source

Vous d'inclure un module dans un autre module ... y compris d'un module dans un autre module, bien sûr!

module Bmodule
  def greet
    puts 'hello world'
  end
end

module Amodule
  include Bmodule
end

class MyClass
  include Amodule
end

MyClass.new.greet # => hello world
19
répondu Jörg W Mittag 2011-02-07 05:27:41
la source

Rails

Pour les Rails, vous aurez envie de faire quelque chose comme ceci:

module_b.rb

module ModuleB
  extend ActiveSupport::Concern

  included do
    include ModuleA
  end
end

my_model.rb

class MyModel < ActiveRecord::Base

  include ModuleB

end

ModuleA est inclus dans ModuleB, qui est alors inclus dans MyModel classe.

14
répondu Joshua Pinter 2017-01-21 07:06:53
la source

j'aime cette syntaxe le meilleur:

module Bmodule
  def greet
    puts 'hello world'
  end
end

module Amodule
  def self.included(receiver)
    receiver.send :include, Bmodule
  end
end

class MyClass
  include Amodule
end

MyClass.new.greet # => hello world
8
répondu Tom Rossi 2014-07-18 01:28:41
la source

Autres questions sur