我正在开发一个Rails应用程序,默认情况下会将用户帐户设置为他们选择的子域。作为一种选择,他们可以将自己的完整域名映射到他们的帐户。
到目前为止,这是我设置的方式。我正在使用subdomain-fu为路由提供支持:
# routes.rb
map.with_options :conditions => {:subdomain => true} do |app|
app.resources # User's application routes are all mapped here
end
map.with_options :conditions => {:subdomain => false} do |www|
www.resources # Public-facing sales website routes are mapped here
end
除此之外,我使用method described here通过子域或完整域名来访问帐户:
before_filter :set_current_account
def set_current_account
if request.host.ends_with? current_domain
# via subdomain
@current_club = Club.find_by_subdomain(current_subdomain)
else
# via full domain
@current_club = Club.find_by_mapped_domain(request.host)
end
end
我还没有完成构建它的过程,但我已经看到我将遇到路由问题。如果request.host
是某个random.com域,那么subdomain-fu不会路由相应的路由?
我认为这不是一个不寻常的问题,所以任何人都可以分享他们如何处理这个问题,或者我如何配置我的路线去做我需要的东西?
答案 0 :(得分:3)
您可以编写一个Rack中间件,在将域转换为Rails应用程序之前将其转换为子域。
class AccountDetector
def initialize(app)
@app = app
end
def call(env)
account = Club.find_by_mapped_domain(env["HTTP_HOST"])
if account
env["HTTP_HOST"] = "#{account.subdomain}.yourdomain.com"
end
@app.call(env)
end
end
然后将其添加到environment.rb
:
config.middleware.use AccountDetector
答案 1 :(得分:2)
我遇到了这个问题,试图在一个应用程序中做太多。你将开始在非常奇怪的地方做条件,你不应该这样做。我决定让2个单独的Rails应用程序将通配符域指向用户的应用程序,然后将www.domain.com
和domain.com
指向面向公众的一方。我知道这并没有直接“回答”你的问题。
如果你把它添加到该方法的顶部,那么我可以帮助你解决小代码的问题:
return @current_club if defined?(@current_club)
每次尝试访问@current_club
时都不会进行查询,它会返回您已返回的结果。