The way I did it was to leave my routes file intact, and use Rack middleware to rewrite urls to match the routes (this also has the advantage of not breaking existing urls).
I used the rack-rewrite gem (https://github.com/jtrupiano/rack-rewrite) to rewrite the urls as follows
application.rb
config.middleware.insert_before(Rack::Lock, Rack::Rewrite) do
rewrite /.*/,
Proc.new { |path, rack_env|
slug = rack_env['SERVER_NAME'].split(".")[0]
"/users/#{slug}#{path}"
},
:if => Proc.new {|rack_env|
rack_env["HTTP_ACCEPT"] =~ /(text\/html|application\/json)/ && !(rack_env['SERVER_NAME'] =~ /www\./i)
}
end
Then I had to make sure all of the urls point to the correct domain and path. For this, I overwrote the url_for method as follows
def with_subdomain(subdomain)
subdomain = (subdomain || "")
subdomain += "." unless subdomain.empty?
[subdomain, request.domain, request.port_string].join
end
def url_for(options = nil)
if options.is_a?(User)
return "http://#{with_subdomain(options.slug)}"
end
if options.kind_of?(Hash)
options[:only_path] = false
options[:port] = nil
if options[:_positional_args] && user = options[:_positional_args].find {|pa| pa.is_a?(User)}
options[:host] = with_subdomain(user.slug)
return super(options).gsub(/\/users\/\d+/, '')
end
options[:host] = with_subdomain("www")
end
super
end
No comments:
Post a Comment