[Ror-es] Intentando sobrescribir métodos de un controlador
Francesc Esplugas
francesc.esplugas at gmail.com
Sat Jan 3 09:35:03 GMT 2009
Y heredar de otro controlador con los metodos comunes no te sirve?
On 02/01/2009, at 21:25, Luis Mayoral <luis at luismayoral.com> wrote:
> 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 determinad
> os métodos de un controlador.
>
> Hasta ahora he intentado atacar el problema por tres caminos
> distintos:
>
> 1. include normal y corriente
> =============================
>
> module ExtendedTestController
> def test
> render :text => "TestController de instancia"
> end
> end
>
> class TestController < ApplicationController
> include ExtendedTestController
>
> def 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 TestContro
> ller os saldrá "TestController de instancia".
>
> 2. extender la clase
> ====================
>
> module ExtendedTestController
> def included(base)
> base.extend(ClassMethods)
> end
>
> module ClassMethods
> def test
> render :text => "TestController de clase"
> end
> end
> end
>
> Con el TestController original saldría el texto de "TestController o
> riginal", es decir, que "ignora" a los métodos de clase. Si eliminás
> emos el método test de TestController directamente saltaría la vista
> que Rails consiguiese encontrar, o el error avisándote de que no ex
> iste la vista.
>
> 3. alias_method_chain
> =====================
>
> module ExtendedTestController
> def included(base)
> base.class_eval do
> alias_method_chain :test, :changes
> end
> end
>
> def 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 pre
> cisamente 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 e
> l 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
> _______________________________________________
> Ror-es mailing list
> Ror-es at lists.simplelogica.net
> http://lists.simplelogica.net/mailman/listinfo/ror-es
More information about the Ror-es
mailing list