2011-01-31 7 views
5

Mam kilka kontrolerów z metod, które renderowania widoku indeksu. To powoduje, że piszę render :index pod koniec większości metod. Oto przykładJak mogę OSUSZAĆ wszystkie te wywołania renderowania: indeks?

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 

Idealnie, chciałbym po prostu przenieść kod renderowania na after filtrem, ale jako kontroler sprawia, że ​​połączenia do renderowania przed pójściem do po filtrze, że nie jest to opcja.

Posiadam dużą liczbę takich kontrolerów, więc rozwiązanie mogłoby usunąć wiele powtarzających się kodów.

Ta aplikacja jest obecnie Rails 2.3, jednak zostanie uaktualniony do Rails 3 w następnym miesiącu lub dwóch. Więc chociaż wolałbym technikę, która działa na 2.3, rozwiązania Rails 3 nadal byłyby doceniane.

+3

tylko uwaga, spróbuj uniknąć connascence znaczenia jak daleko, jak to możliwe. (I tak * nie *, aby użyj tego "słowa" do dzień, ponieważ właśnie dowiedziałem się o connascence **: D **) Patrz http://scotland-on-rails.s3.amazonaws.com/1A03_JimWeirich-SOR.mp4 jeśli zainteresowany – Zabba

+0

To była bardzo dobra rozmowa. Dziękuję za udostępnienie. Mój przykład nie jest żadnym kodem, który napisałem. Po prostu wydawałem losowy kod, ale na przykład niewiele. Cieszę się, że to zrobiłem, bo inaczej nigdy bym się nie dowiedziała o koniugowaniu :-) –

Odpowiedz

4

Jeśli naprawdę chcesz PODNOSIĆ tę akcję, a jeśli jest bardzo powszechna, możesz zrobić własne metaprogramowanie. Najpierw utwórz plik render_with_index.rb z tej definicji modułu:

 
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 

następnie uwzględnić moduł w kontrolerze i określenia metod, które powinny spowodować, ze wskaźnikiem (upewnij się, że wezwanie render_with_index dzieje się po swoich deklaracji metody

.
 
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 

Ten moduł umożliwia teraz czyni żadnych działań z szablonu indeksu po prostu przez dodanie go do rozmowy render_with_index.

+0

+1 za inne podejście :) – hade

+0

Doskonale :-) Dokładnie to, czego szukałem. –

2

Wygląda całkiem SUCHA dla mnie. IMHO to dobry nawyk, aby wspomnieć o tym, który szablon jest renderowany, jeśli nie chcesz używać konkretnego szablonu kontrolera.

Jeśli kod renderowania rozciąga się od jednej linijki na kilka wierszy kodu, chciałbym DRY je do oddzielnej metody renderowania.

Powiązane problemy