Rails 3路由和多个域

我的应用程序允许人们创建投资组合 我希望他们能够将他们的域名连接到他们的投资组合。

所以somedomain.com会显示/ portfolio / 12,someotherdomain.com会显示/ portfolio / 13等等。 但我不想重定向。 我希望用户在浏览器url中看到somedomain.com。

我怎么做?

好的,我找到了这个解决方案:

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

由于我没有很多自定义域,现在这很好,但问题是 – 如何使这个动态,从db读取域和id数据?

首先,您应该在投资组合模型中添加一个字段以保存用户的域。 确保此字段是唯一的。 向数据库中的字段添加索引也是明智之举。

其次,设置你的根目录以路由到portfolios#show action,就像你已经做的那样,但没有约束。

然后,在PortfoliosController#show方法中,执行以下检查:

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

在此之后,唯一要做的就是确保您自己的域名不会触发portfolio#show action。 这可以使用您之前使用的约束来完成,但现在使用您自己的域。 请务必将此行放在routes.rb上方,作为portfolio#show #show action的行,因为优先级基于创建顺序。

好的,我们假设您拥有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::RecordNotFoundexception中解救,但让我们将其留给另一个讨论。

希望这可以帮助。

对于没有修补的routes.rb文件, request对象似乎不可用。

有一些插件使它可用,但其中大多数似乎已过时。 这里的request_routing似乎与最新的提交日期一致,因此它是最新的。 虽然我怀疑它可以与开箱即用的Rails 3.0一起使用,但这是一个开始,可能并不难以移植。

您的用户可以设置DNS CNAME重定向,以便对theirdomain.com请求登陆your_app.com/portfolio/12