[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