2013-08-05 94 views
3

我使用Rails引擎作爲cms。它一切正常。我爲此添加設計。從多個控制器繼承。

我生成的設計控制器繼承自Devise :: SessionsController。但是有一些過濾器從引擎中的另一個控制器運行,在這種情況下不會運行。很多網站依賴於這些正在運行的過濾器。當然,我可以複製它們,但這是不好的juju。

所以我的問題是:如何讓一個控制器從另一個控制器運行過濾器?我不想編輯任何一個寶石。

+0

不知道自己在做什麼。但是這不會做這份工作嗎? https://github.com/comfy/comfortable-mexican-sofa/wiki/Changing-default-authentication – Grocery

+0

嘿@Grocery我想你是舒適的創造者?如果是這樣,這就是即將做的事情:我已經分叉你的寶石修改它一點點(你可能實際上需要它的一些功能),並使用它創建一個應用程序。我想在前端有一個用戶登錄系統。我用它來進行身份驗證。但對於設計意見,他們需要一個實際的佈局。我們的應用程序佈局極少,應用程序將包含許多完全可定製的網站。 – DickieBoy

+0

所以要做到這一點,我需要將功能從舒適混入應用程序中的設計控制器。我最終將'RenderMethods'包含到了我的設計控制器中,重寫了一些設計函數以使它們使用cms_layouts(以及我們的一些功能)來實現它。如果你想看看,給我留言,事實上,我會很高興看到它的另一雙眼睛。 – DickieBoy

回答

2

Ruby中不支持多繼承。我認爲將濾波器提取到模塊中並將它們混合成爲最乾淨的解決方案。

見例如: http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_modules.html

+0

所以我不得不將它們添加到mixin中,然後將它包含到設計控制器中,並將它們保存在gem中。我不確定你的意思是什麼「提取」 – DickieBoy

+0

是的,我的意思是:把你的過濾方法放到一個模塊中。然後將此模塊包含在引擎的控制器和會話控制器中。 – Wukerplank

+0

我希望我不會修改任何寶石。有沒有另外一種方法呢? – DickieBoy

2

沒有爲設計提供另一種選擇:config.parent_controller。它默認爲ApplicationController,但可以更改爲其他值。在我的情況下(Rails API),我使用ApiController。在config/initializers/devise.rb

Devise.setup do |config| # ... other configuration options config.parent_controller = 'ApiController' end