2012-11-09 64 views
0

我正在編寫這個小部件,它將包含在網站的單個頁面中,所以我沒有看到在ApplicationController中聲明我正在執行的操作的理由。但是,這個新的窗口小部件確實有相當大的複雜性,所以我想讓它與通常處理這個頁面的控制器分開,因爲控制器已經具有相當複雜的一點。我最初想到了我的設計,我可以爲控制器製作一個輔助模塊,並保留大部分的部件邏輯。如何使用Rails在控制器助手中保存實例變量DRY?

我想寫這個幫手模塊,但後來我意識到有一個特定的數組我需要能夠從一個位置初始化,但多個方法需要訪問它,它需要被保險,它在任何其他方法調用此數組之前被初始化。有沒有辦法在這樣一個模塊中做類似於before_filter的事情,我可以確保在使用之前初始化這個變量,還是有更好的方法來處理這種「Rails方式」?

回答

1

我想你可以創建一個新類並在before_filter或控制器中實例化它。 不知道你想要什麼來實現,但是一個例子可以是:

class MyArrayBuilder 
    def initialize(some, param) 
    #something 
    end 

    def get_array 
    return my_array 
    end 
end 

class SomethingsController < ApplicationController 

    before_filter :build_array 

    def build_array 
    @array = MyArrayBuilder.new(some, param).get_array 
    end 
end 

然後傳遞@array變量的幫手。

我不確定是否有一種「Rails方式」來做你想做的事情:Rails作爲一種慣例,但是當你開始關心設計和DRY時,我認爲最好從面向對象編程的良好實踐比Rails約定好。

+0

你的意思是在與控制器相同的文件中定義一個類,或者在其他地方定義它,然後讓控制器在過濾器之前做一個初始化它?如果沒有在控制器文件中定義(這是我在使用「Rails方式」的地方),那麼應該在rails根目錄中定義它的位置? –

+0

如果你只需要它在控制器中,我會在控制器文件中定義它,如果你將在別的地方重複使用它,我會把它放在'lib'或'app/models'目錄中。 「模型」文件夾中有一種常見方法,即「只將模型鏈接到數據庫中的表格」,但對於我來說,這不是「正確」的行爲,如果您可以添加一個「第一公民「的域名對象,它應該生活在模型中。 –

+0

所以關於這個站點的怪異部分是模型是從服務調用中即時生成的,所以根本沒有任何ActiveRecord的使用。我之所以想把控制邏輯與控制器分離,是因爲它遠離那個頁面上的唯一控件,而且控制器中的邏輯變得相當......好......需要重構,而我想知道我該如何解決這個問題。 –

0

你可能需要一個好的主持人。在ruby toolbox找它。

演示者是控制器和視圖之間的中間地帶。它可以訪問數據,並處理與演示相關的複雜邏輯,而不是數據操作。它可以做很多幹淨簡單的事情。檢查出來,也許這對你的問題有好處。

Tutorial for draper

相關問題