2013-04-05 76 views
1

在我的Rails 3應用程序,我有一個包含我自己的助手一個模塊,覆蓋了幾個建在軌助手:僅加載傭工

module MyHelpers 
    def form_for(*args) 
    ... 
    end 

    def link_to(*args) 
    ... 
    end 
end 

上述模塊住在lib文件夾中。

我希望這些助手只能用於特定的控制器操作。我在這第一個嘗試是這樣的:

require "my_helpers" 
class MyController < ApplicationController 

    before_filter :add_helpers 

    def add_helpers 
    if some_condition 
     ApplicationHelper.send(:include, MyHelpers) 
    end 
    end 
    .. 
end 

Module.send(:包括ModuleB)是包含另一個模塊中的一個模塊的有效方式,但它不會做什麼,我需要在這種情況下, :我的模塊中的方法在視圖中不可用。看起來好像Rails已經在任何控制器方法運行之前確定了哪些輔助方法可用於視圖。

有沒有辦法做我需要的?

我知道我可以全局重寫form_for方法,但我寧願不這樣做。

我認爲這個問題的答案來自於理解軌道如何使視圖可以訪問輔助方法。

+0

爲什麼不乾脆重新命名方法呢?他們顯然做了別的事情,然後'form_for'和'link_to'在做。 – 2013-04-05 09:56:45

+0

因爲我正在開發的庫正在做一些應該在任何rails應用程序中與任何控制器一起工作的東西。控制器本身不應該知道發生了什麼。 – cmrichards 2013-04-05 10:10:56

+1

我強烈建議不要覆蓋原生Rails的幫助器方法。當'link_to'不工作時,會引發一些新的代碼,就像Rails所說的那樣。正如本傑明所說,我建議重新命名這些方法,並在必要時更新您的視圖。 – osahyoun 2013-04-05 10:26:32

回答

0

由於Rails的自動加載,幷包括在app/helpers目錄中的所有助手,你可以嘗試把你的助手在不同的位置,例如在lib目錄。

這樣,.rb文件被解析並加載,但該模塊不會自動包含在ApplicationHelper類中。然後你可以像你說的那樣在你之前的過濾器中做到這一點。

+0

這正是我的客戶Helper模塊所在的位置,在lib文件夾中。問題不在於它被自動包含在內,問題是我只需要在某些請求中包含該模塊。 – cmrichards 2013-04-05 10:18:44

+0

什麼不起作用?你有錯誤信息嗎?你在'config/application.rb'中正確配置了'autoload_paths'嗎? – Vapire 2013-04-05 10:21:36

+0

沒有錯誤消息,所以它似乎包含在ApplicationHelper模塊中。問題是我的模塊中的方法不可用於視圖。 – cmrichards 2013-04-05 10:25:01

0

Vapire對將這些模塊放置在app/helpers以外的地方有一個很好的觀點。我會更進一步,說你想做什麼可能不是明智的 - 有一些方法可用或不是每個動作的基礎上感覺有點太脆弱,我喜歡。

我寧願採取在你的控制器和ApplicationController之間放置定製控制器超類的方法,這些定製控制器超類包含模塊(或者只是在你的超類中有這些方法)。

+0

這正是我的客戶Helper模塊存放在lib文件夾中的地方。問題不在於它被自動包含在內,問題是我只需要在某些請求中包含該模塊。 – cmrichards 2013-04-05 10:25:33

+0

我建議你採取一種方法,這意味着你不僅僅包含某些請求的模塊,而是包含針對不同控制器(和/或控制器超類)的模塊。 – pat 2013-04-05 10:28:25

+0

是的,但我只需要它可以在幾個不同的控制器之間傳播的某些操作。我將使用配置文件來確定哪些操作(或url)應該受到影響。 – cmrichards 2013-04-05 10:31:44

-1

答案是使用「助手」類方法如下:

require "my_helpers" 
class MyController < ApplicationController 

    before_filter :add_helpers 

    def add_helpers 
    if some_condition 
     MyController.helper MyHelpers 
    end 
    end 
    .. 
end 
+0

你真的需要'需要'my_helpers''嗎?如果模塊在你的'lib'目錄下,這應該會自動發生... – Vapire 2013-04-05 11:12:45

+0

是的,你需要在rails 3中需要它(除非你添加一些自動加載路徑)。在Rails 2中它是自動的,但現在你必須明確。 – cmrichards 2013-04-05 13:21:11

+0

這不是答案,因爲'MyController.helper MyHelpers''導致助手永久加載控制器。它延遲加載助手,但一旦加載它可以通過任何其他操作調用。 – kuboon 2015-12-24 03:17:05

0

一旦你在一個控制器類或輔助類加載助手,它將保持請求之後加載。 您需要在操作後卸載它們。 不幸的是,沒有官方的方式來卸載部分幫手,你需要寫下它。

class MyController < ApplicationController 
    around_action :load_helper, only: :create 

    def load_helper 
    self.class.helper_method :your_helper_method 
    yield 
    self.class.helper { undef your_helper_method } 
    end 
end 
0

config.action_controller.include_all_helpers應設置爲false