2012-10-18 16 views
9

Sto usando Ruby on Rails 3.2.2. Sto implementando un modulo e includendolo in una classe utilizzando la funzione RoR ActiveSupport::Concern. Rende disponibile il codice di blocco included do ... end dichiarato all'interno di quello da eseguire nel contesto di classe della classe in cui è incluso il modulo.Cosa non dovrei includere nel blocco `include do ... end`?

mio dubbio è: Cosa non dovrei includere nel blocco included do ... end? Questo è, ad esempio, una pratica "comune"/"buona" per fare quanto segue?

module MyModule 
    extend ActiveSupport::Concern 

    class MyModuleClass 
    attr_accessor :attr1, :attr2, :attr3 

    def initialize(attrs) 
    @attr1 = attrs[:attr1] 
    @attr2 = attrs[:attr2] 
    @attr3 = attrs[:attr3] 
    end 
    end 

    included do 
    @my_module_class = MyModuleClass.new(some_attrs) 
    end 
end 

Più, sarà la variabile @my_module_class disponibile come attributo nella classe compresa di MyModule (proposito: Vorrei rendere il @my_module_class di essere "visibile" solo internamente MyModule dal è destinato ad essere usato solo in quel modulo)? Ci sono alcuni esempi "avanzati" o tutorial su come gestire situazioni come quelle che sto tentando di istanziare nel blocco included do ... end del codice sopra? Che cosa consigli?

risposta

2

@my_class sarà un'istanza di MyClass e non MyModule. Se si vuole fare in tutte le istanze di MyClass essere un'istanza di MyModule si dovrebbe scrivere:

include MyModule 

all'interno della definizione di classe.

Penso che la mia risposta abbia senso se si guarda la versione originale di questa domanda prima che fosse modificata.

EDIT 1:

Aggiungiamo al tuo esempio e dire di avere una classe chiamata Foo:

class Foo 
    include MyModule 
end 

Si vuole fare un'istanza di MyModuleClass che è associato con Foo ma sembra che tu non voglia veramente modificare Foo o dargli accesso a MyModuleClass. Propongo che si utilizza una tabella hash:

module MyModule 
    # ... 

    @hash = {} 
    class << self 
     attr_accessor :hash 
    end 

    included do 
     MyModule.hash[self] = MyModuleClass.new(some_attrs) 
    end 
end 

Credo che funzionerà, ed evita l'aggiunta di una variabile di istanza per l'oggetto Foo di classe. Tecnicamente, qualsiasi parte del codice ruby ​​può accedere a MyModule.hash ma dovresti inserire un commento nel codice sorgente che dice alle persone di NON farlo e non pubblicizzare l'hash esistente.

+0

Grazie, ma la domanda "principale" è relativa a "Cosa dovrei * non * includere nel blocco' include do ... end'? " relativo, * ad esempio *, al mio caso. Il resto è un "di più", anche se per me è molto importante. Tuttavia, io * non * voglio rendere tutte le istanze di 'MyModuleClass' un'istanza di' MyModule', ma renderle disponibili solo internamente a 'MyModule'; inoltre, l'istruzione 'include MyModule' all'interno della definizione della classe è implicita/ovvia, dal momento che il modulo è destinato ad essere incluso in una classe. – user12882

+0

La domanda "cosa non dovrei fare" è troppo vaga per me per rispondere veramente, ma per favore vedi il mio "Edit 1" sopra dove cerco di risolvere il problema che stai chiedendo. –

Problemi correlati