2011-01-31 54 views
5

我有一堆控制器與呈現索引視圖的方法。這導致我在大多數方法的末尾寫入render :index。這裏有一個例子如何幹掉所有這些調用來渲染:index?

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 

理想情況下,我只想移動渲染代碼到一個過濾器後,但作爲控制器進行調用前都要經過過濾,這不是一個選項,以渲染。

我有大量的這樣的控制器,所以一個解決方案將刪除大量的重複代碼。

這個應用程序目前仍然Rails 2.3,但是,它會在未來一兩個月升級到Rails 3。所以雖然我更喜歡2.3版本的技術,但Rails 3解決方案仍然值得讚賞。

+3

只是注意,儘量避免意義的connascence儘可能。(我只是*有*爲用那個'單詞'來一天,因爲我剛剛瞭解到有關動態**:D **)如果有興趣,請參閱http://scotland-on-rails.s3.amazonaws.com/1A03_JimWeirich-SOR.mp4 – Zabba 2011-01-31 12:12:52

+0

這是一個非常好的演講。感謝分享它。我的例子不是我寫的任何代碼。例如,我只是隨機發送代碼。我很高興我這樣做,但是,否則我可能永遠不會了解connascence :-) – 2011-01-31 18:01:44

回答

4

如果你真的想幹這個動作,如果它很常見,那麼你可以做一些你自己的元編程。首先創建這個模塊定義一個render_with_index.rb文件:

 
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 

然後在您的控制器模塊定義應該與指數呈現方法(請確保您的方法聲明後render_with_index調用發生

 
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 

這個模塊現在,您可以簡單地將其添加到render_with_index調用渲染指數模板的任何行動。

2

看起來很乾我。恕我直言,如果您不想使用控制器方法特定的模板,請提及您所呈現的模板是一個好習慣。

如果您的渲染代碼從一行代碼擴展到幾行代碼,我會將它們幹成單獨的渲染方法。