Buenas a todos.
Llevo varios dÃas intentando encontrar la manera de que a través de la
inclusión de un módulo pueda ser capaz de sobrescribir determinados
métodos de un controlador.
Hasta ahora he intentado atacar el problema por tres caminos distintos:
-
include normal y corriente
=============================module ExtendedTestController
def test
render :text => “TestController de instancia”
end
endclass TestController < ApplicationController
include ExtendedTestControllerdef test
render :text => “TestController original”
end
end
Si ejecutáis este fragmento de código os saldrá en el navegador
“TestController original”. Si elimináis el método test de
TestController os saldrá “TestController de instancia”.
-
extender la clase
====================module ExtendedTestController
def included(base)
base.extend(ClassMethods)
endmodule ClassMethods
def test
render :text => “TestController de clase”
end
end
end
Con el TestController original saldrÃa el texto de “TestController
original”, es decir, que “ignora” a los métodos de clase. Si
eliminásemos el método test de TestController directamente saltarÃa la
vista que Rails consiguiese encontrar, o el error avisándote de que no
existe la vista.
-
alias_method_chain
=====================module ExtendedTestController
def included(base)
base.class_eval do
alias_method_chain :test, :changes
end
enddef test_with_changes
render :text => “TestController de instancia”
end
end
Igual que con 2. no funciona.
Ya no se me ocurre qué más probar
Por el momento lo más cercano a la solución es el punto 1, que es la
que estoy utilizando, pero eso me obliga a que en todos los módulos
tenga que definir los mismos métodos, y lo que ando buscando es
precisamente poder tener en la clase original los métodos “base” y que
si incluyo el módulo X solo sobrescriba el método foo y si incluyo el
módulo Y solo cambie el método bar. Y es que el incluir el módulo X o
el módulo Y vendrá dado en función de una constante definida, que para
cada dominio donde se ejecute la aplicación será distinta.
Grasias de antebrazo… digo… gracias de antemano
Salu2