2010-10-25 15 views
7

Estoy tratando de extraer un código común en una gema.rails3 gema: acts_as_something

Estoy pensando que acts_as_something es una buena estrategia para una simple reutilización.

¿Hay algún buen tutorial que discuta esto para las gemas rails3? He encontrado varios que discutir rails2 (como http://guides.rubyonrails.org/plugins.html), sino que es específica para rails2

Éstos son algunos de los tutoriales/blogs ya he leído:

gracias

Respuesta

12

UPDA TE: ¡Tengo una entrada de blog sobre la base de esta respuesta, pero con mucho más detalle: http://thoughtsincomputation.com/posts/coding-an-acts_as-gem-for-rails-3

-

No estoy al tanto de otra fuente tutorial de la parte superior de mi cabeza, pero aquí están algunos consejos generales.

Rails 3 hace uso de una función muy útil llamada Railtie - ver http://api.rubyonrails.org/classes/Rails/Railtie.html.

Entonces, si estuviera implementando una gema acts_as_ *, comenzaría allí. Mi railtie podría ser algo como:

# lib/acts_as_awesome/railtie.rb 
require 'rails' 
require 'acts_as_awesome' 

module ActsAsAwesome 
    class Railtie < Rails::Railtie 
    config.to_prepare do 
     ApplicationController.send(:extend, ActsAsAwesome::Hook) 
    end 
    end 
end 

y el código ActsAsAwesome :: Gancho:

# lib/acts_as_awesome/hook.rb 
module ActsAsAwesome::Hook 
    def acts_as_awesome(*args) 
    options = args.extract_options! 
    # do the things that make the controller awesome. 
    include ActsAsAwesome::InstanceMethods 
    before_filter :an_awesome_filter 
    end 
end 

me siento los conceptos aquí son sólidos y han utilizado procesos similares antes. Básicamente, le indicaría a Rails que ejecute el bloque to_prepare una vez durante la producción y antes de cada solicitud en desarrollo (queremos eso porque ApplicationController se volverá a cargar en esos momentos, lo que podría aniquilar nuestro método de enganche); y el gancho es solo eso: agrega un gancho a todos los controladores (o más bien, todos los controladores que extienden ApplicationController) para permitir al usuario introducir el código real "Awesome" en sus controladores sin afectar a los controladores que no lo necesitan.

El gancho #acts_as_awesome no, en sí mismo, transmite la funcionalidad Awesome. Eso se debe a que no todos los controladores pueden necesitar esta funcionalidad. En cambio, el método es responsable de introducir real cosas increíbles, a través del módulo ActsAsAwesome :: InstanceMethods. De esta forma, el usuario solo obtiene la funcionalidad Awesome si llama explícitamente al método acts_as_awesome. También agrega un filtro de antes al controlador para demostrar que el código en este método se evaluaría exactamente igual que si estuviera en la propia clase de controlador de destino.

Esta técnica debería funcionar exactamente igual si se dirige a modelos en lugar de a controladores: simplemente inyecte su gancho en ActiveRecord :: Base. Como AR: B solo se carga en el arranque de Rails, probablemente debería poder ponerlo en un inicializador (consulte los documentos de Railtie), pero me reservo el derecho de equivocarme aquí.

Un problema relacionado con la edad: la documentación dice que debería haber sido detectada automáticamente, pero a menudo tengo problemas con esto.Para evitarlo, simplemente necesita la razón del archivo fuente principal de su gema (en el ejemplo anterior, sería lib/acts_as_awesome.rb).

se puede ver toda la fuente ActsAsAwesome en todo su esplendor en mi cuenta de GitHub: http://github.com/sinisterchipmunk/acts_as_awesome

espero que esto sea útil. Su pregunta fue de alto nivel por lo que una respuesta de alto nivel es lo mejor que puedo hacer.

-Colin MacKenzie IV

http://thoughtsincomputation.com

@sinisterchipmnk

+0

muchas gracias. Estaba siguiendo tus tutoriales. esto es útil – cbrulak

+0

No hay problema, feliz de ayudar. Gracias por leer (¡y mencionar!) Mi contenido :) Nunca hubiera visto esta pregunta si no fuera por el enlace. (Lo vi aparecer en las estadísticas del sitio, heh.) – sinisterchipmunk

+0

Creé una joya basada en ese artículo y un antiguo plugin de Rails. Si lo deseas, puedes echarle un vistazo, ya que es un buen ejemplo: https://github.com/toptierlabs/acts_as_fulltextable – Tony