2013-11-21 79 views
1

這個問題有兩個部分:Rails的負載幫手覆蓋其他輔助

  1. 這是可能加載,還是沒有,具體的輔助文件,這取決於平臺您使用?
  2. 如何覆蓋其他幫助文件中的函數?

我想加載一個名爲的助手文件MobileHelper當我使用手機檢測會話時。在桌面平臺上我不想加載這個文件。

另一方面,我有一個歡迎使用幫助show_comments功能。這MobileHelper必須改變這個show_comments函數的邏輯。

現在,我已經提出了一個部分解決方案,如果它檢測到您正在使用移動設備,則會在原始功能內調用具有其他名稱的移動版本功能。

module WelcomeHelper 
    def show_comments 
    return mobile_show_comments if user_agent.mobile? 
    # original code 
    end 
end 

module MobileHelper 
    def mobile_show_comments 
    # mobile code 
    end 
end 

最終版本我想有是兩個相同的命名函數兩個輔助文件此文件中的一個必須是唯一的在移動平臺上

回答

0
  1. 這是負載可能加載一個給定請求頭的文件,例如用戶代理(它會告訴你用戶在哪個平臺上)。但是,一旦文件被加載,它將保持加載,因爲你的服務器在請求之間保持運行。但是,默認情況下,Rails將在啓動服務器時加載所有文件(包括幫助程序),並在請求之間保持加載狀態。因此,它是不加載的請求的基礎上的文件,除非你手動管理模塊或類自己的除去一個好辦法:How to undefine class in Ruby?

  2. 的方式Rails包含助手到視圖和控制器是非常簡單,它只是增加了所有方法在助手中定義到控制器和視圖。由於這個原因,你將無法重寫一個助手到另一個助手的方法。

1你的情況,我看可能的解決方案是:

# check for the platform the user is on: 
if request.user_agent.match /iphone|android/ 
    # call your mobile helper's method here 
else 
    # call default helper's method here 
end 

由於所有的助手都已經被加載時,Rails的啓動時,你必須派遣基礎上,適當的幫手當前請求的user_agent。

0

這是有點過時,但你可能會發現mobile_fu有幫助。他們的方法是將.mobile註冊爲MIME類型,然後通過目標視圖處理桌面瀏覽器和移動瀏覽器之間的差異。

另一個潛在的機會是命名空間的路由,以便有一組桌面和另一個移動路線。當用戶第一次訪問該網站時,您會將它們重定向到適當名稱空間內的頁面。通過這種方法,您可以創建一個DesktopBaseController和MobileBaseController(每個都繼承自ApplicationController),其中包括適用於桌面/移動設備的適當助手。命名空間控制器可以從適當的桌面/移動基地繼承。這可能會導致關於如何保留代碼的大量決策,但它爲處理桌面和移動瀏覽方面的差異提供了很大的靈活性(例如,除了渲染不同之外,尋呼機可能獲得更少的記錄等)。

+0

如果項目沒有實際完成,此解決方案將非常有用。將來我會嘗試使用它。 –