2012-04-15 16 views
17

Estoy haciendo un pequeño programa para Rails que incluye algunos de mis métodos que he construido dentro de un módulo dentro del módulo ApplicationHelper. He aquí un ejemplo:Haciendo que un módulo herede de otro módulo en Ruby

module Helper 
    def time 
     Time.now.year 
    end 
end 

module ApplicationHelper 
    # Inherit from Helper here... 
end 

Sé que ApplicationHelper < Helper y include Helper iba a funcionar en el contexto de una clase, pero lo usarías para hereda de módulo a módulo? Gracias.

Respuesta

22

De hecho, usted puede definir un módulo dentro de otro módulo, y luego incluir dentro de la exterior.

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

Nunca pensé en usar un módulo dentro de otro, ¡gracias por la ayuda! – beakr

+7

No estoy seguro de qué es lo que declara Helper dentro de ApplicationHelper, aparte de ocultarlo del código global. Lo importante es que 'incluir' (y 'extender') funciona tanto para módulos como para clases. –

1

Una posible sorpresa es que si el módulo incluido adjunta los métodos de clase, entonces esos métodos se pueden unir al objeto equivocado.

En algunos casos, puede ser más seguro incluir el módulo 'principal' directamente en la clase base, luego incluir otro módulo con los nuevos métodos. p.ej.

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

    module InstanceMethods 
    def new_method 
     #.. 
    end 
    end 

end 

Los nuevos métodos no están definidos directamente en ApplicationHelper como el include Helper sería ejecuta después de las definiciones de métodos, haciendo que estos sean sobrescritos por Helper. Uno podría definir alternativamente los métodos dentro del bloque class_eval

+0

Aquí tiene las instrucciones de inclusión dentro de la definición de su método, que probablemente no sea la forma correcta de hacerlo ... Esta es una buena advertencia contra la escritura, que incluye las definiciones de métodos dentro de. El include debe estar fuera de la definición del método como en la respuesta de DigitalRoss – emery

Cuestiones relacionadas