2010-03-11 20 views
19

Estoy intentando agregar una función que será accesible en todas las partes de mi programa. Quiero algo como:Ruby on Rails: Módulos frente a clases

def GlobalFunctions.my_function(x,y) 
    puts x + y 
end 

para ser accesible para todos los modelos. Específicamente, estoy tratando de usar una función como esta en mi archivo seeds.rb, pero lo más probable es que esté reutilizando el código y no quiera ninguna redundancia. Ahora sé que puedo hacer una clase simple, pero también podría hacer un módulo. ¿Cuáles son algunas razones para ir en cualquier dirección? Y una vez que he decidido qué tipo de usar, ¿cómo lo hago accesible durante todo el programa?

me han tratado un módulo, pero seguir recibiendo "[archivo de módulo] esperada app/para definir [ModuleName]"

Respuesta

43

Se definiría una clase por algo que querrá hacer casos de. En este caso, un módulo probablemente sería mejor, como módulos, básicamente, sólo el código de grupo en conjunto:

module GlobalFunctions 
    def self.my_function(x,y) 
    puts x+y 
    end 
end 

GlobalFunctions.my_function(4,5) # => 9 

Alternativamente, se podría definir en el kernel, y luego simplemente llamar en cualquier lugar. Kernel es donde se definen métodos como puts.

def Kernel.my_function(x,y) 
    puts x + y 
end 

my_function(4,5) # => 9 
+0

Muchas gracias! – JackCA

+0

¿Hay una ubicación específica para guardar estos módulos? –

+1

Normalmente pongo módulos en la carpeta 'lib'. – Tintin81

2

PreciousBodilyFluids es correcta, y si esto GlobalFunctions es parte de un proyecto RoR, puede que desee para nombrar el archivo global_functions.rb y colocarlo en el directorio lib/ para ayudarle a evitar el mensaje de error que aparece en la parte de tu pregunta.

16

Agregar métodos a Kernel (respuesta de PreciousBodilyFluids) generalmente se considera un mal olor y puede llevar a errores muy difíciles de encontrar en proyectos grandes.

Es mucho más aceptado para relevantly el espacio de nombres del código y ponerlo en/lib /.

class Formatting 
    def self.bold(str) 
    return "<strong>#{str}</strong>" 
    end 
end 

continuación, puede:

require 'formatting' 
puts Formatting.bold("text") 

o

require 'formatting' 
include Formatting 

puts bold("text") 

Será evidente para cualquiera que se acerca al código más tarde de lo que estás usando demasiado. Si está utilizando Rails no necesitará el requerimiento.