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::RecordNotFound
exception中解救,但让我们将其留给另一个讨论。
希望这可以帮助。
对于没有修补的routes.rb
文件, request
对象似乎不可用。
有一些插件使它可用,但其中大多数似乎已过时。 这里的request_routing似乎与最新的提交日期一致,因此它是最新的。 虽然我怀疑它可以与开箱即用的Rails 3.0一起使用,但这是一个开始,可能并不难以移植。
您的用户可以设置DNS CNAME重定向,以便对theirdomain.com
请求登陆your_app.com/portfolio/12
。