Rails使用通配符路由所有子域

时间:2016-10-24 13:40:09

标签: ruby-on-rails

我有一个包含模式的现有网站:

CappedIn.com/users/1

我希望我的用户也可以通过

访问

MyUsername.CappedIn.com

我希望能够捕获所有子域,然后在控制器中执行快速查找并呈现用户配置文件。呈现的URL当然是MyUsername.CappedIn.com

这可能吗?如何实现?

请注意,我目前在Rails 3.2上,但将迁移到Rails 5.因此,Rails 5解决方案将是最好的。

1 个答案:

答案 0 :(得分:1)

要从当前URI的子域中查找User模型实例,您可以执行类似于以下内容的操作(有目的的简单粗略示例):

通过ApplicationController中的钩子查找用户

class ApplicationController < ActionController::Base
  # ...
  before_action :lookup_user_from_subdomain
  # ...

  def lookup_user_from_subdomain
    @subdomain_user = User.where(username: request.subdomain).first
    # Do stuff with @subdomain_user, and/or handle User not found,
    #  check that subdomain != 'www' if you need to, etc.
  end

  # ...
end

从UserController显示个人资料

class UserController < ApplicationController
  # ...
  def subdomain_profile
    @profile = @subdomain_user.profile if @subdomain_user.present?

    # You may want to check for request.xhr? and handle 
    #  respnding to js/json here, for ajax requests to display
    #  profile in a sidebar or somewhere else besides a profile
    #  page.
    # Or, just simply render the profile of the subdomain-user here.
  end

  # ...
end

注意我使用了before_action,这是一个较新的(Rails~5)约定,而不是before_filter

您可以在request过滤器here上查看有关ActionController对象here的更多信息,以及更多信息。

查看this Railscast on subdomains以获取更多信息,尤其是http://lvh.me:3000/域,用于测试本地开发中的子域。

如果您正在计划执行某些繁重的工作,例如每个子域(用户)的范围可用数据,或者每个用户使用不同的数据库,或者以某种方式对每个用户以不同的方式处理应用程序体验,请查看Acts as Tenant gem。它在Rails应用程序中处理多租户,并内置支持通过子域加载用户或帐户。