2011-01-31 16 views
5

Tengo un montón de controladores con métodos que rinden la vista de índice. Esto me lleva a escribir render :index al final de la mayoría de los métodos. He aquí un ejemplo¿Cómo puedo SECAR todas estas llamadas para renderizar: índice?

def index 
    @models = Model.find(:all) 
end 

def new_models 
    @models = Model.find_by_new(true) 

    render :index 
end 

def old_models 
    @models = Model.find_by_new(false) 

    render :index 
end 

Idealmente, me gustaría simplemente mover el código de render en un filtro final, pero como el controlador hace una llamada para hacer antes de ir a después de filtro que no es una opción.

Tengo una gran cantidad de controladores como este, así que una solución eliminaría una gran cantidad de código repetido.

Esta aplicación se encuentra actualmente en Rails 2.3, sin embargo, se actualizará a Rails 3 en el próximo mes o dos. Así que, aunque preferiría una técnica que funciona en 2.3, las soluciones únicas de Rails 3 aún serían apreciadas.

+3

Sólo una nota, trate de evitar connascencia del significado medida de lo posible. (acabo * había * a usar esa 'palabra' para día, porque acabo de aprender sobre la connotación **: D **) Ver http://scotland-on-rails.s3.amazonaws.com/1A03_JimWeirich-SOR.mp4 si está interesado – Zabba

+0

Fue una muy buena charla. Gracias por compartirlo. Mi ejemplo no es ningún código que haya escrito realmente. Sin embargo, estaba sacando un código aleatorio sin mucho para el ejemplo. Me alegro de haberlo hecho así, de lo contrario, quizás nunca hubiera aprendido sobre la connivencia :-) –

Respuesta

4

Si realmente desea SECAR esta acción, y si es muy común, entonces puede hacer su propia meta-programación. En primer lugar crear un archivo render_with_index.rb con esta definición de módulo:

 
module RenderWithIndex 
    def self.included klass 
    klass.class_eval do 
     def self.render_with_index * methods 
     methods.each do |method| 
      self.class_eval <<-EVAL 
      alias :old_method :#{method} 

      def #{method} 
       old_method 
       render :index 
      end 
      EVAL 
     end 
     end 
    end 
    end 
end 

Luego incluyen ese módulo en el controlador y definir los métodos que deben convertir con el índice (asegúrese de que la llamada render_with_index sucede después de sus declaraciones de métodos

.
 
include RenderWithIndex 

def index 
    @models = Model.find(:all) 
end 

def new_models 
    @models = Model.find_by_new(true) 
end 

def old_models 
    @models = Model.find_by_new(false) 
end 

render_with_index :new_models, :old_models 

Este módulo le permite ahora hacer que cualquier acción con la plantilla índice simplemente añadiéndolo a la llamada render_with_index.

+0

+1 para un enfoque diferente :) – hade

+0

Excelente :-) Exactamente lo que estaba buscando. –

2

Parece bastante seco para mí. En mi humilde opinión, es un buen hábito mencionar qué plantilla está representando si no desea utilizar la plantilla específica del método del controlador.

Si su código de renderización se extiende desde un trazador de líneas a varias líneas de código, YO los SECARía en un método de representación por separado.

Cuestiones relacionadas