2011-11-30 67 views
1

背景:的Rails 3.1自定義控制器和視圖W /默認

  • 我建立一個應用程序,允許用戶創建自己的網站(例如,mywebsite.alexlod.com)
  • 每個網站的所有者附屬和我在一起,所以我相信他們寫自己的Rails代碼
  • 每一個網站應該有默認的控制器和視圖,除非這些業主的一個創建自己的

下面是我設想控制研究ers working:

我在想app/controllers/是什麼在默認情況下,但是當在<subdomain>頂級目錄中指定文件時,該文件將優先於默認值。

讓我舉個例子。假設我的一個網站所有者(foo.alexlod.com)想調整app/controllers/photos_controller.rb。他們應該能夠創建foo/controllers/photos_controller.rb,從而使用他們的控制器而不是默認值。我認爲這裏的正確方法與路由和加載路徑有關,但我是Rails和Ruby的新手,可以使用一些指導。

至於意見,我希望他們工作很多。當在<subdomain>/views/中定義視圖或部分時,將使用該視圖而不是位於app/views/中的缺省值。

我意識到我的計劃在這裏違反了默認的rails目錄結構。但是這種方法比每個控制器操作中的替代案例陳述更簡單。除非有更好的選擇?

回答

0

我相信engines可能是你想要的東西。該鏈接有點舊,但仍應適用於Rails 3.1。每個子域的控制器和視圖可以放置在各自的引擎文件夾中。

現在,您只需要確定每個請求加載哪個引擎即可。這是我認爲可能阻礙你的想法的部分 - 你不希望在生產中一直加載和卸載代碼。

在這種情況下,您可能希望選擇使用模板語言Liquid。但是,這對用戶來說控制的很少。

+0

謝謝,拉蒙。這個解決方案工作得很好,並且在傑夫的建議下,我也能很好地處理視圖。 – alexlod

+0

@alexlod你是如何最終爲每個子域(動態)加載一個引擎的?我很想看到你的解決方案。 – Jimmy

+0

@Jimmy,你不能動態加載引擎我不這麼認爲。所以我加載了每個引擎並添加了路由,以便在給定某個子域時使用正確的控制器。 – alexlod

0

我可能有一個部分的答案,因爲它聽起來像你想做一些非常類似於我爲我的網站的移動版本做的事情。在確定用戶是移動用戶之後,我將一個移動目錄添加到路徑中,以覆蓋任何我已針對移動優化的視圖。如果該視圖不存在於移動目錄中,則默認爲默認視圖。

這裏是我做了觀點:

在app /控制器/ application_controller.rb

before_filter :prepend_view_path_if_subdomain 

def prepend_view_path_if_subdomain 
    unless pSubdomains.blank? 
    subdomain = request.subdomain.first 

    #This will add the subdomain view directory to the view path before the default 
    #Rails view directory and any views here will be picked up and rendered. 
    prepend_view_path 'app/' + subdomain + '/views' 
    end 
end 

在做同樣的事情控制器,然而,由於路由有點麻煩。沒有prepend_controller_path方法等於prepend_view_path。老實說,我不知道如何處理這個問題,你可以使用你的case語句方法,或者可能動態轉發請求到子域控制器(如果存在)。我認爲有可能在控制器中添加一個before_filter,它可以很好地評估每個請求,就像我上面顯示的視圖一樣,然後確定應該使用哪個控制器。

我也偶然發現了這個問題:Rails 3.1 load controller from different path based on subdomain,不知道它是否對你有幫助。

+0

謝謝,傑夫!我遵循拉蒙的建議,看着引擎。我希望引擎能夠很好地使用prepend_view_path方法。引擎處理控制器和路由,prepend_view_path將處理視圖。酷:)。 – alexlod

相關問題