10

¿Cuál es la forma recomendada de extender el comportamiento de clase, a través de class_eval y módulos (no por herencia) si quiero extender una clase enterrada en una gema de una aplicación de Rails 3?¿Cómo/cuándo/dónde extender las clases de gemas (a través de class_eval y módulos) en Rails 3?

Un ejemplo es la siguiente:

Quiero añadir la capacidad de crear enlaces permanentes para las etiquetas y categorías (a través de la ActsAsTaggableOn y gemas ActsAsCategory).

Han definido los modelos Tag y Category.

que quiero hacer básicamente esto:

Category.class_eval do 
    has_friendly_id :title 
end 

Tag.class_eval do 
    has_friendly_id :title 
end 

Incluso si hay otras maneras de añadir esta funcionalidad que podrían ser específicos de la gema, ¿cuál es la forma recomendada de añadir el comportamiento de las clases en una Carriles 3 aplicación como esta?

Tengo algunas otras gemas que he creado para las que quiero hacer esto, como un modelo Configuration y un modelo Asset. Me gustaría poder agregar crear una clase de modelo app/models/configuration.rb a mi aplicación, y actuaría como si acabara de hacer class_eval.

De todos modos, ¿cómo se supone que funciona? No puedo encontrar nada que cubra esto de ninguno de los blogs/docs/gists actuales de Rails 3.

Respuesta

9

hago esto de la siguiente manera, primero agregar un archivo de config/inicializadores donde se puede exigir a los archivos que contienen las extensiones:

# config/initializers/extensions.rb 
require "#{Rails.root}/app/models/category.rb" 
require "#{Rails.root}/app/models/tag.rb" 

A continuación, puede simplemente volver a abrir las clases y añadir cualquier otra cosa que necesita:

# app/models/category.rb 
class Category 
    has_friendly_id :title 
end 

el único inconveniente es que el servidor tiene que ser reiniciado para que cualquier cambio en estos archivos para tener efecto, no estoy seguro si hay una manera mejor que superar eso.

+0

tengo el mismo problema, me sale 'LoadError: aplicación/modelos/tag.rb esperados para definir Tag' – MhdSyrwan

+0

MhdSyrwan: Significa que dentro de su archivo 'tag.rb', la primera clase que se debe definir debe llamarse exactamente "Etiqueta", así que parece que no lo nombraste de la manera correcta. –

0

Puede utilizar rails_engine_decorator joya: https://github.com/atd/rails_engine_decorators

Sólo añadir en su Gemfile:

gem 'rails_engine_decorator' 

Y el usuario class_eval en sus decoradores:

/app/decorators/models/category_decorator.rb 
/app/decorators/models/tag_decorator.rb 

Funciona para mí. ¡Espero que le sea útil!

Cuestiones relacionadas