2010-05-21 99 views
13

我正在使用Rails引擎,但我需要自定義一些控制器操作。覆蓋Rails引擎控制器操作

我其實分叉引擎,並將這些自定義項實現到我自己的fork中,但我想知道是否有一種Rails引擎中的官方方式來覆蓋和自定義控制器。

+0

看看那裏http://stackoverflow.com/questions/5045068/extending-controllers-of-a-rails-3-engine-in-the-main-app – Andrei 2011-02-19 14:36:16

回答

18

只需在您自己的app\controllers文件夾中定義一個具有相同名稱的控制器,即可首先找到它。 這樣你可以輕鬆地定製它。

請注意:因爲它是首先找到的,所以您需要從引擎中更換整個控制器。這可能正是你想要的。在某些情況下,您只需要稍微調整一下,那麼重新開放課程要好得多,而且只需重新定義所需的內容。

例子做的就是可以在這裏找到:http://edgeguides.rubyonrails.org/engines.html#overriding-models-and-controllers

+0

比維護定製叉更容易! 感謝和抱歉的跛腳問題! – 2010-05-21 10:40:15

+0

這將覆蓋整個控制器,而不僅僅是一個動作。 – 2013-01-31 20:40:53

+0

我沒有另外聲明。但至少你可以自定義它。你有更好的解決方案嗎? – nathanvda 2013-02-01 19:04:33

2

在接受答案的鏈接實際上並沒有提供一個例子來重寫控制器。他們提到了「公開分類」文件,但並沒有解釋如何正確地做到這一點。如果您在應用程序中打開引擎類,則會因爲引用/打開當前正在定義的類而導致出現循環依賴關係錯誤。因此,您需要確保先加載引擎的實際類。

# in my app 
# app/controllers/blazer/base_controller.rb 
load Blazer::Engine.root.join('app/controllers/blazer/base_controller.rb') 
Blazer::BaseController.class_eval do 
    filter_access_to :all 
end 

就我而言,我使用的Blazer寶石和增加驗證它。由於我使用聲明式授權,Blazer不直接支持,所以我需要打開Blazer的基本控制器,並向其添加授權要求。

+1

這應該是可以接受的答案,因爲它給出了OP要求的示例以及軌道指南中的文檔格式。 – dft 2017-10-25 20:18:23