2012-03-11 15 views
7

Ho circa 5 modelli che si comportano in modo molto simile. In effetti, mi piacerebbe che condividessero un'azione per visualizzarli. Ad esempio, per i modelli di auto, camion, Van voglio avere una definizione del tipo:Utilizzare un'azione per più modelli

[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 

Come avrei fatto questo in modo non sto definendo la stessa azione in più controller? (Che non è molto ASCIUTTO) Sarebbe nel controller_applicativo? E se non è troppo chiedere, come potrei fare così condividono anche la vista?

UPDATE

Sarebbe preferibile se questo può essere fuori i singoli regolatori. Se riesco a farlo funzionare correttamente, non vorrei nemmeno dover generare i singoli controller.

+0

Potresti essere interessato a fare capolino o utilizzare [Risorse ereditabili] (https://github.com/josevalim/inherited_resources) di José Valim. ActiveAdmin lo utilizza per le azioni RESTful predefinite. – coreyward

risposta

3

Sarebbe qualcosa di simile a questo lavoro per voi?

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

Nei controllori:

class CarsController < ApplicationController 
    include Display 
end 

class TrucksController < ApplicationController 
    include Display 
end 

class VansController < ApplicationController 
    include Display 
end 

Edit: un tentativo di fare questo senza singoli controllori

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 

In 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: Se avete sentito parlare di extend per i moduli e si chiedono perché/quando utilizzare include vs extend, vedere What is the difference between include and extend in Ruby? (sostanzialmente includono sia per le istanze, si estendono per metodi di classe).

+0

Molto bene! Ho intenzione di resistere per un po 'se non ti dispiace. Se riesco a trovare la risposta a cui sto pensando, non avrei nemmeno bisogno di controller per ciascuno dei modelli –

+0

@KyleMacey - Penso che la mia modifica funzionerà per te ma non l'ho ancora testata. Fammi sapere se lo provi e non funziona, quindi posso rimuoverlo. – Kyle

+0

Invece di usare 'Object.const_get' puoi usare' constantize'. Puoi accorciare l'intera linea fino a 'm = nome.chomp ('Controller'). Classify.constantize'. – coreyward

Problemi correlati