2012-03-11 19 views
7

Tengo alrededor de 5 modelos que se comportan de manera muy similar. De hecho, me gustaría que compartan una acción para mostrarlos. Por ejemplo, para los modelos de coches, camiones, Van Quiero tener una definición como:Use una sola acción para múltiples modelos

[Car, Truck, Van].each do |Model| 
    action_for Model do #I made this up to show what I mean 
    def index 
     @model = Model.all 
     @model_names = @model.map(&:name).join(', ') 
    end 
    end 
end 

¿Cómo voy a hacer esto, así que no estoy definiendo la misma acción en varios controladores? (Que no es muy seco) ¿Sería en el application_controller? Y si no es demasiado pedir, ¿cómo podría hacer esto para que también compartan la vista?

ACTUALIZACIÓN

Sería preferible si esto puede estar fuera de los controladores individuales. Si puedo hacer que esto funcione bien, me gustaría ni siquiera tener que generar los controladores individuales.

+0

Es posible que le interese echar un vistazo o usar [Recursos heredables] (https://github.com/josevalim/inherited_resources) de José Valim. ActiveAdmin lo usa para acciones RESTful predeterminadas. – coreyward

Respuesta

3

¿Algo como esto funcionaría para usted?

module Display 
    def index 
    m = self.class.to_s.chomp('Controller').classify.constantize 
    @model = m.all 
    @model_names = @model.map(&:name).join(', ') 
    end 
end 

En los controladores:

class CarsController < ApplicationController 
    include Display 
end 

class TrucksController < ApplicationController 
    include Display 
end 

class VansController < ApplicationController 
    include Display 
end 

Editar: un intento de hacer esto sin controladores individuales

class DisplaysController < ApplicationController 
    def index 
    @model = params[:model].constantize.all 
    @model_names = @model.map(&:name).join(', ') 
    end 
end 

routes.rb

match "display" => "display#index", :as => :display 

En una vista

link_to "Display Cars", display_path(:model => "Car") 
link_to "Display Trucks", display_path(:model => "Truck") 
link_to "Display Vans", display_path(:model => "Van") 

Nota: Si usted ha oído hablar de extend para los módulos y se pregunta por qué/cuándo utilizar include vs extend, ver What is the difference between include and extend in Ruby? (básicamente es para incluir los casos, se extienden por los métodos de clase).

+0

¡Muy bien! Aunque voy a aguantar un poco si no te importa. Si puedo encontrar la respuesta en la que estoy pensando, ni siquiera debería necesitar controladores para cada uno de los modelos –

+0

@KyleMacey - Creo que mi edición funcionará para usted, pero no la he probado. Avíseme si lo prueba y no funciona, así que puedo eliminarlo. – Kyle

+0

En lugar de utilizar 'Object.const_get' puedes usar' constantize'. Puede acortar esa línea completa a 'm = name.chomp ('Controller'). Classify.constantize'. – coreyward

Cuestiones relacionadas