2013-01-23 42 views
0

我有一個關於在控制器動作中重複使用代碼的問題。我認爲這是一個相當標準的情況,所以我對Rails中的最佳實踐感興趣。如何在Rails中重用嵌套控制器中的渲染操作?

比方說,我有一個films資源與對應的FilmsController,其中有嵌套資源comments服務CommentsController。嵌套資源可以使用其indexshow操作自行呈現。但是,也應該可以將註釋嵌入到相應的電影頁面中。

現在,問題是,在FilmsController.show內重複使用CommentsController的代碼的最佳方法是什麼?

1)強制CommentsController.index呈現爲一個字符串,然後將其傳遞給一個變量到電影視圖?

或2)直接在電影視圖中調用CommentsController.index作爲一種「部分」,從那裏執行數據庫查詢?

或者3)在CommentsController中創建一個單獨的方法負責數據庫的處理,從CommentsController.indexFilmsController.show都調用它,並在這兩個地方使用相應的視圖呢?

對我來說,選項1)和2)似乎有點混亂,而3)不是模塊化的,並且涉及一些代碼重複。有沒有更好的方法來完成這個?

非常感謝!

+1

查找演示模式在Ruby on Rails的 –

+0

@TonyHopkinson - 感謝您的想法,演示模式可能確實是有用的在某些情況下,當通過數據更復雜。總而言之,它看起來像我正在與我的選項3),而儘可能封裝的東西。 –

+0

簡單的數據有一個壞習慣,即不簡單,快速,但歡迎您。 –

回答

0

現在,問題是,什麼是從FilmsController.show內的CommentsController重用代碼的最佳方式?

你可以共享控制器邏輯移動到你的應用程序內部的控制器(或lib和適當地需要它),一拉:

class ApplicationController < ActionController::Base 

    def foo 
    @foo = "foo" 
    end 

end 

評論控制器:

class CommentsController < ApplicationController 

    before_filter :foo, :only => [:index] 

    def index  
    end 

end 

電影控制器:

class FilmsController < ApplicationController 

    before_filter :foo, :only => [:show] 

    def show 
    end 

end 

For repeau ated視圖邏輯,你可以將它移動到一個公共文件夾,如your_app/app/views/shared/_foo.html.erb並進行適當的渲染。


另一種選擇是相關的代碼放到一個外部模塊:

的lib/mymodule.rb

module MyModule 
    def foo 
    end 
end 

然後你就可以包括模塊控制器內部或任何你想訪問你的foo方法。

class CommentsController < ApplicationController 
    include MyModule 

    def index 
     foo() 
    end 

end 
+0

這是一個有趣的想法,使用一個共同的祖先爲聚合控制器及其組件,我可能實際上使用它的一些其他方面。但對於這個簡單的問題,它似乎使代碼更加模糊和分散。把'foo'代碼放在'CommentsController'中並且明確地調用它,我仍然看起來比較乾淨。 –

+0

是的,我可以從經驗中發言,當我說調試時找出ApplicationController調用的方法有點棘手。我認爲一個更清潔的方法是將重複的代碼分割成一個lib模塊,然後將其包含在相關的控制器操作中。至少你有這樣一個明確的指示,即你的方法是從外部來源調用的,並且你將繼承代碼繼承到永遠不會使用它的控制器中。 – Noz

相關問題