2011-05-19 97 views
13

我的應用允許人們創建投資組合。我希望他們能夠將他們的域名連接到他們的投資組合。Rails 3路由和多個域名

所以somedomain.com會顯示/ portfolio/12,someotherdomain.com會顯示/ portfolio/13等等。但我不想重定向。我希望用戶在瀏覽器網址中查看somedomain.com。

我該怎麼做?

好吧,我發現這個解決方案:

match "/" => "portfolio#show", 
    :constraints => { :domain => "somedomain.com" }, 
    :defaults => { :id => '1' } 

由於我沒有太多的自定義域,這是罰款,但現在的問題是 - 如何讓這種動態,閱讀區和從數據庫的ID數據?

+0

路徑在應用程序啓動時僅解析一次。所以你必須猴子補丁你的Rails接受默認的ruby'Proc',然後根據傳入的'request'從DB返回正確的id。 – Laas 2011-05-19 10:20:56

回答

7

首先,您應該爲投資組合模型添加一個字段來保存用戶的域。確保這個字段是唯一的。將索引添加到數據庫中的字段也是明智的。

其次,設置您的根目錄路由到portfolios#show行動,因爲您已經做了,但沒有約束。

然後,在PortfoliosController#show方法,做以下檢查:

if params[:id] 
    @portfolio = Portfolio.find(params[:id]) 
else 
    @portfolio = Portfolio.find_by_domain(request.host) 
end 

在此之後,唯一剩下要做的就是確保自己的域名不會觸發portfolio#show行動。這可以用你之前使用的約束來完成,但現在用你自己的域。請確保將此行放在portfolio#show操作的行上方的routes.rb中,因爲優先級基於創建順序。

0

request對象似乎沒有提供給routes.rb文件沒有一些修補程序。

有一些插件使它可用,但其中大多數似乎已過時。這裏的這個request_routing似乎與最新的提交日期,因此它是最新的。雖然我懷疑它可以與開箱即用的Rails 3.0一起使用,但這是一個開始,可能不會很難移植。

-3

您的用戶可以設置DNS CNAME重定向,以便theirdomain.com的請求登錄your_app.com/portfolio/12

+0

您無法執行指向完整網址的CNAME。 CNAME僅適用於URL的域部分。你暗示的是DNS提供商通常提供的重定向,這不是Peter想要的。 – Laas 2011-05-19 10:17:41

+0

@Laas感謝您糾正我。也許這種事情(DNS重定向)可以與子域一起工作,但這也不是Peter想要的。 – abhishek 2011-05-19 11:48:49

+2

實際上沒有DNS重定向這樣的事情。 (1)將域指向服務提供者的主機,(2)該主機具有接受該域的網絡服務器,並用「HTTP 3XX」(重定向)響應回答所有請求。 – Laas 2011-05-19 12:45:02

26

好吧,我們假設您擁有yourdomain.com並將其用作您的應用程序的主頁。而其他任何域名如somedomain.net都將映射到投資組合頁面。

首先,在您的routes.rb中,您需要趕上yourdomain.com並將其映射到您的主頁所在的任何位置,以便從其他人羣中脫穎而出。

root :to => "static#home", :constraints => { :domain => "yourdomain.com" } 

然後,你需要捉對任何領域的任何其他根並將其轉發給您的PortfoliosController

root :to => "portfolios#show" 

請記住,如果前面的線不匹配這條線才能確認。

然後在您的PortfoliosController通過其域名而不是id找到請求的投資組合。

def show 
    @portfolio = Portfolio.find_by_domain(request.host) 
    … 
end 

當然,你可能希望在情況下ActiveRecord::RecordNotFound例外域是不是在你的數據庫搶救,但讓我們留到另一個討論。

希望這會有所幫助。

+2

非常好!順便說一句,如果你也允許域的':edit /:update'動作(例如,讓投資組合所有者改變它),可以考慮使用'before_filter'獲取id並將其放在'param'哈希值中。 – Laas 2011-05-19 12:50:26

+0

太好了,謝謝。我想這與Kris建議的解決方案基本相同。 – 2011-05-19 16:19:03

+0

這就是爲什麼我愛Rails ...那麼簡單... !!!!!! – Philip 2015-01-12 14:08:44