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,如果域不在您的数据库中,您可能希望从异常中解救,但让我们将其留给另一个讨论.
希望这可以帮助.
首先,您应该在投资组合模型中添加一个字段来保存用户的域.确保此字段是唯一的.向数据库中的字段添加索引也是明智之举.
其次,将您的根设置为路由到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,因为优先级基于创建顺序.
| 归档时间: |
|
| 查看次数: |
7978 次 |
| 最近记录: |