Intentando poner a disposición los métodos que he almacenado en un Módulo que se encuentra en la app/models (nota al margen: ¿no estoy seguro de si este es el lugar correcto para los módulos?).
Módulo:
module MyModule class MyClass def some_method # do something end end endModelo de usuario:
class User < ApplicationRecord include MyModule def another_method some_method end end Obtengo un NoMethodError: NoMethodError (undefined method 'some_method' for #<User:0x00007f6a3ce452c0>
Parece que no entendiste lo que hacen los módulos y las clases en Ruby. En Ruby, un módulo es simplemente un objeto que envuelve un conjunto de métodos y constantes.
Un módulo puede extender otros módulos, clases y objetos y puede incluirse en clases implementando así la herencia múltiple. Los módulos en Ruby cumplen el rol que los rasgos, espacios de nombres y singletons cumplen en otros lenguajes.
Las clases son en realidad módulos (Module es parte de la cadena de ancestros de Class) con la diferencia clave de que puede crear instancias de una clase y esa clase puede heredar de otra clase y no puede extender otros objetos ni incluirse.
El ejemplo de código aquí en realidad no tiene sentido. Si desea declarar un método que estará disponible para las clases que incluyen un módulo, debe declararlo en el propio módulo:
module MyModule def some_method # do something end end Cuando llame a User#another_method , buscará en la cadena de ancestros de la clase User hasta que encuentre el método que está definido en MyModule .
module MyModule class MyClass def some_method # do something end end end De hecho, definirá la clase MyClass con un método de instancia que solo está disponible para las instancias de MyClass . Lo único que hace el módulo aquí es cambiar el anidamiento del módulo para que la clase se defina en MyModule en lugar del espacio de nombres global.
Si desea mezclar un método de un método en su clase, simplemente coloque los métodos directamente en el módulo (sin una clase intermedia).
Módulo:
module MyModule def some_method # do something end endModelo de usuario:
class User < ApplicationRecord include MyModule def another_method some_method end endEche un vistazo a esta respuesta , primero debe crear una instancia de su clase. o si quieres
class User < ApplicationRecord include MyModule def another_method my_instance = MyClass.new my_instance.some_method end endEn cuanto a un lugar para almacenar su Módulo, eche un vistazo a esta guía sobre objetos de servicio , me dio algo de inspiración cuando se trata de diferentes módulos.