2011-11-22 83 views
28

如果我在其他控制器中有一個方法與我正在寫入的方法不同,並且我想調用該方法,是否有可能,或者我應該考慮將該方法移動到幫手?從另一個控制器調用方法

+1

您可以通過調用另一個控制器的方法將事實添加到要解決的問題嗎?目前它非常模糊,解決方案將取決於問題。 – mliebelt

+0

確實,請詳細說明您正在嘗試解決的問題。共享方法在做什麼? – nathanvda

回答

45

你可以在技術上創建另一個控制器的實例並調用其中的方法,但它很單調乏味,容易出錯並且極不推薦。

如果該功能對兩個控制器都是通用的,那麼您應該在ApplicationController或其他創建的超類控制器中使用它。

class ApplicationController < ActionController::Base 
    def common_to_all_controllers 
    # some code 
    end 
end 

class SuperController < ApplicationController 
    def common_to_some_controllers 
    # some other code 
    end 
end 

class MyController < SuperController 
    # has access to common_to_all_controllers and common_to_some_controllers 
end 

class MyOtherController < ApplicationController 
    # has access to common_to_all_controllers only 
end 

另一種方式做到這一點爲jimworm建議,是使用一個模塊的通用功能。

# lib/common_stuff.rb 
module CommonStuff 
    def common_thing 
    # code 
    end 
end 

# app/controllers/my_controller.rb 
require 'common_stuff' 
class MyController < ApplicationController 
    include CommonStuff 
    # has access to common_thing 
end 
+5

或包含在「模塊」中。 – jimworm

+0

'包含GoodSuggestion'謝謝@jimworm – edgerunner

+1

創建其他控制器的實例? Arrrrrrrgggh(確實)。另一個選擇,因爲問題太模糊:將代碼移動到模型。 – nathanvda

2

嘗試,並逐步打動你的方法來你的模型,如果他們不適用於一個模型,然後一個幫手,如果仍然需要訪問其他地方放在ApplicationController中

+1

我永遠不會將代碼從控制器移動到助手,而是移動到'/ lib'中的模塊。只有視圖代碼應該存在於幫手中。 – nathanvda

+1

把東西放在幫手裏只是短暫的。你會得到一個不需要放入lib /將所有東西放入模塊中都不太好的地步。 –

+1

我更喜歡使用模塊而不是幫助器,因爲它們是真正的OO,我可以隨意包含/擴展它們。我可以將具有實際意義的東西分組在一起。助手只是桶。我建議只使用那些與視圖相關的方法。不確定你的意思是「你會發現......」。 – nathanvda

0

如果你需要有一些DB操作做,那麼你可以寫一個模型中常見的功能(類的方法)。在模型中定義的功能可以通過所有控制器訪問。但是這個解決方案適用於所有情況。

相關問題