17

Me encanta ActiveSupport::Concern.¿Por qué se ha desaprobado el módulo InstanceMethods?

Esto hace que sea fácil de añadir funcionalidad a sus clases, con una sintaxis agradable.

De todas formas, en Rails 3.2, el módulo InstanceMethods ya no se utiliza. Si he entendido bien, deberíamos definir nuestros métodos en el bloque included (en realidad es sólo en el cuerpo del módulo):

# edit: don't do this! The method definition should just be in the body of the module 
included do 
    def my_method; end 
end 

Me preguntaba si alguien sabe por qué decidieron hacer eso? mirada

Respuesta

26

Vamos en el ejemplo que vincula por primera vez.

module TagLib 
    extend ActiveSupport::Concern 

    module ClassMethods 
    def find_by_tags() 
     # ... 
    end 
    end 

    module InstanceMethods 
    def tags() 
     # ... 
    end 
    end 
end 

Cuando se incluyen TagLib en su clase como la preocupación se extiende automáticamente el módulo de clase con ClassMethods e incluye módulo de InstanceMethods.

class Foo 
    include TagLib 
    # is roughly the same as 
    include TagLib::InstanceMethods 
    extend TagLib::ClassMethods 
end 

Pero como es posible que dado cuenta de que ya estamos incluyendo módulo de TagLib sí por lo que los métodos definidos dentro de él ya están disponibles como métodos de instancia de la clase. ¿Por qué querrías tener un módulo de InstanceMethods por separado entonces?

module TagLib 
    extend ActiveSupport::Concern 

    module ClassMethods 
    def find_by_tags() 
     # ... 
    end 
    end 

    def tags() 
    # ... 
    end 
end 

class Foo 
    include TagLib 
    # does only `extend TagLib::ClassMethods` for you 
end 
+0

Ok, tiene sentido. Pero ahora me pregunto por qué hicieron esta elección en el primer lugar, entonces ... ¿No hay diferencias entre la forma en que incluyen el módulo InstanceMethods y cómo los métodos del módulo ejemplo normales se incluyen cuando acabo de hacer 'incluyen TagLib'? – Robin

+0

¿Fue solo por coherencia? – Robin

+0

No estoy seguro, pero creo que tomó un tiempo darse cuenta de esto. –

Cuestiones relacionadas