2011-09-30 57 views
1

我對Rails稍微陌生(即愚蠢且需要一些教導)。在其他控制器中調用控制器的方法(保持DRY)

我有一個控制器(稱爲ControllerFoo),執行一個特定的任務(theMethod),這可能在其他控制器(例如,從ControllerBar)有用。所以,當然,該方法被定義爲self.theMethodControllerFoo(這意味着它是一個類方法,對嗎?),並在ControllerBar中訪問爲ControllerFoo.theMethod。困惑了嗎?

問題出在這裏:ControllerFoo.theMethod使用會話數據,當從ControllerBar調用時,會話爲零。實際上,從本身來看,會話似乎也是零。我猜我在說的是類方法不能訪問會話數據?

<咆哮> 我恨如何會話數據不能簡單地在任何地方像PHP < /咆哮>

所以現在訪問,因爲我不是足夠聰明,知道如何正確地做到這一點,我剛剛在我的應用程序的幾個地方重複了邏輯。但這根本不是乾的,我討厭它。

那麼如何在一個控制器中創建一個方法,該方法可以被其他控制器訪問並且也可以訪問會話數據?

class ControllerFoo < ApplicationController 
    def self.theMethod (greeting) 
     p "#{greeting} #{session[:user]}!" 
    end 
end 

class ControllerBar < ApplicationController 
    def show 
     ControllerFoo.theMethod("Hello,") 
    end 
end 

回答

5

幾個選項...

  1. 把共享方法在共享父ApplicationController中
  2. 創建模塊ControllerFoo和ControllerBar都將包括

例如

module SharedModule 
    def theMethod (greeting) 
     p "#{greeting} #{session[:user]}!" 
    end 
end 
class ControllerFoo < ApplicationController 
    include SharedModule 
end 

class ControllerBar < ApplicationController 
    include SharedModule 
    def show 
     theMethod("Hello,") 
    end 
end 
+0

我實際上想到了這兩種選擇,所以我猜我沒有我想象的那麼糟糕:)接下來是一個問題:理論上的'theMethod'是一個創建操作。你會繼續嗎? –

+0

將複雜的代碼移動到模型或庫中。您始終可以同時創建新控制器並調用常用方法。目標是保持你的控制器方法非常短。 – DGM

+0

我對這個問題有點困惑。對於我將影響代碼組織的創建操作,有什麼特別之處?整個行動是完全一樣的嗎?如果是這樣,爲什麼它在單獨的控制器? –

1

你這樣做的方式是紅寶石將創建包含要共享,並將其納入你必須定義這些方法的類的類(或實例)方法的模塊。

相關問題