我有一个包含模式的现有网站:
CappedIn.com/users/1
我希望我的用户也可以通过
访问 MyUsername.CappedIn.com
我希望能够捕获所有子域,然后在控制器中执行快速查找并呈现用户配置文件。呈现的URL当然是MyUsername.CappedIn.com
这可能吗?如何实现?
请注意,我目前在Rails 3.2上,但将迁移到Rails 5.因此,Rails 5解决方案将是最好的。
答案 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应用程序中处理多租户,并内置支持通过子域加载用户或帐户。