我的應用程序具有普通用戶和管理員。它有一個顯示部件一些渲染助手:這些小部件的Rails:在運行時動態包含每個請求的幫助程序
module ApplicationHelper
def widget
"widget"
end
end
對於管理員,也有擴展版本:
module AdminHelper
def widget
"admin-widget"
end
end
該應用程序被配置爲不通過config.action_controller.include_all_helpers = false
包括默認情況下所有的助手。
當管理員查看一個頁面 - 相同的控制器,相同的視圖模板 - ,我想通過重載助手與他們的AdminHelper版本來渲染它的擴展版本。如果當前登錄的用戶是管理員,我如何在每個請求的基礎上將ApplicationHelper與AdminHelper重載?
我已經試過
class ApplicationController < ActionController::Base
before_action :include_backend_helpers
protected
def include_backend_helpers
self.class.helper "pica/backend" if admin_signed_in?
end
end
但除非是ApplicationController的請求之間重新加載,這並不工作。
謝謝你的詳細答案!我不希望檢查用戶在每個小部件中的角色 - 這是相當多餘和麻煩的時候你有幾十個,對於我的觀點和部分,我只是'prepend_view_path''如果admin_signed_in?' - 這樣我可以根據需要在個別基礎上覆蓋它們;我所缺少的是一個類似的優雅的交易方法與幫手。 –
janfoeh
2014-09-13 16:42:03
如果你有幾十個組件,我會嘗試找到一些我可以定義爲基類的東西。然後,在基類中,我會做類似'm =「admin _#{method}」;返回self.call(m)如果admin_signed_in? && self.respond_to?(m)'在裏面。這似乎是你可以用[cells](https://github.com/apotonick/cells)很好地完成的事情。 – 2014-09-13 17:44:48
我會給這個想法一個旋轉,謝謝。對於這個項目,我已經考慮過Cells,並且出於概念上的原因將它解僱了,但我會再次嘗試。 – janfoeh 2014-09-13 18:26:39