Rails 3路由和多个域

Pet*_*man 13 ruby-on-rails ruby-on-rails-3

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

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

我怎么做?

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

match "/" => "portfolio#show", 
  :constraints => { :domain => "somedomain.com" }, 
  :defaults => { :id => '1' }
Run Code Online (Sandbox Code Playgroud)

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

edg*_*ner 29

好的,我们假设您拥有yourdomain.com并将其用作应用程序的主页.并且任何其他域名somedomain.net都映射到投资组合页面.

首先,在routes.rb你需要的时候,你需要抓住yourdomain.com它并将它映射到你的主页所在的任何地方,这样它才能从其他人群中脱颖而出.

root :to => "static#home", :constraints => { :domain => "yourdomain.com" }
Run Code Online (Sandbox Code Playgroud)

然后你需要捕获任何域上的任何其他root并将其转发给你的 PortfoliosController

root :to => "portfolios#show"
Run Code Online (Sandbox Code Playgroud)

请记住,只有前一行无法匹配才会检查此行.

然后在您PortfoliosController的域中找到所请求的投资组合而不是ID.

def show
  @portfolio = Portfolio.find_by_domain(request.host)
  …
end
Run Code Online (Sandbox Code Playgroud)

当然ActiveRecord::RecordNotFound,如果域不在您的数据库中,您可能希望从异常中解救,但让我们将其留给另一个讨论.

希望这可以帮助.

  • 优秀!顺便说一下,如果您允许对域进行`:edit /:update`操作(例如让组合所有者更改它),请考虑使用`before_filter`来获取id并将其放在`param`哈希中. (2认同)

Kri*_*ris 7

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

其次,将您的根设置为路由到portfolios#show操作,就像您已经做的那样,但没有约束.

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

if params[:id]
  @portfolio = Portfolio.find(params[:id])
else
  @portfolio = Portfolio.find_by_domain(request.host)
end
Run Code Online (Sandbox Code Playgroud)

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