2012-04-15 14 views
17

Sto realizzando un piccolo programma per Rails che include alcuni dei miei metodi che ho creato all'interno di un modulo all'interno del modulo ApplicationHelper. Ecco un esempio:Creazione di un modulo ereditato da un altro modulo in Ruby

module Helper 
    def time 
     Time.now.year 
    end 
end 

module ApplicationHelper 
    # Inherit from Helper here... 
end 

So che ApplicationHelper < Helper e include Helper avrebbe funzionato nel contesto di una classe, ma quello che vorrei utilizzare per eredita modulo-to-modulo? Grazie.

risposta

22

In realtà si può definire un modulo all'interno di un altro modulo, e poi includere entro quella esterna.

so ross$ cat >> mods.rb 
module ApplicationHelper 
    module Helper 
    def time 
     Time.now.year 
    end 
    end 
    include Helper 
end 

class Test 
    include ApplicationHelper 
    def run 
    p time 
    end 
    self 
end.new.run 
so ross$ ruby mods.rb 
2012 
+0

Non ho mai pensato di utilizzare un modulo all'interno di un altro, grazie per l'aiuto! – beakr

+7

Non sono sicuro di cosa dichiari Helper in ApplicationHelper, a parte nasconderlo dal codice globale. L'importante è che "include" (e "estendi") funzioni sia per i moduli che per le classi. –

1

Un possibile trucchetto è che se il modulo incluso allega metodi di classe, questi metodi possono essere collegati all'oggetto sbagliato.

In alcuni casi, potrebbe essere più sicuro includere il modulo "genitore" direttamente nella classe base, quindi includere un altro modulo con i nuovi metodi. per esempio.

module ApplicationHelper 
    def self.included(base) 
    base.class_eval do 
     include Helper 
     include InstanceMethods 
    end 
    end 

    module InstanceMethods 
    def new_method 
     #.. 
    end 
    end 

end 

I nuovi metodi non sono definiti direttamente ApplicationHelper come include Helper verrebbe eseguito dopo le definizioni di metodo, causando loro di essere sovrascritti Helper. Si potrebbe in alternativa definire i metodi all'interno del blocco class_eval

+0

Ecco le istruzioni include all'interno della definizione del metodo, che probabilmente non è il modo giusto per farlo ... Questo è un buon avvertimento contro la scrittura include all'interno delle definizioni dei metodi. L'inclusione dovrebbe essere al di fuori della definizione del metodo come nella risposta di DigitalRoss – emery

Problemi correlati