我是Rails的新手,我的大部分知识都取决于教程:)
所以,我按照这个http://www.railstutorial.org教程创建了非常好的网站,但现在我遇到了一个问题。对于我的用户,我的数据库中有一个特殊列,显示他是哪种类型的用户。例如,我有专栏'学生'这是真的'如果用户是学生并且“假”'如果他没有。
现在我想为学生创建一个子域名。因此,当学生想要注册或登录时,他将被转移到www.student.mysite.com而不是www.mysite.com。
我该如何实现?
谢谢:)
答案 0 :(得分:2)
有很多方法可以做到这一点,特别是你有兴趣查看关于rails的multi-tenancy
-
多租户
虽然多租户通常是拥有多个数据库/资产(每个用户一个)的定义,但是,因为在rails中工作这是非常困难的(我们目前正在处理的事情) ,你可以使用单一数据堆栈的原理
有几个关于如何使用Rails实现此目的的教程:
虽然这与您的问题没有直接关系,但大多数"多租户"问题 通常基于"如何为我的用户创建不同的子域名"
-
<强>子站点强>
Rails上子域的基础是捕获请求,并将其路由到正确的控制器。我们设法通过以下设置实现了这一目标:
#config/routes.rb
constraints Subdomain do #-> lib/subdomain.rb & http://railscasts.com/episodes/221-subdomains-in-rails-3
#Account
namespace :accounts, path: "" do #=> http://[account].domain.com/....
#Index
root to: "application#show"
end
end
#lib/subdomain.rb
class Subdomain
def self.matches?(request)
request.subdomain.present? && request.subdomain != 'www'
end
end
这将使您能够执行以下操作:
#app/controllers/accounts/application_controller.rb
class Account::ApplicationController < ActionController::Base
before_action :set_account
def show
#@account set before_action. If not found, raises "not found" exception ;)
end
private
#Params from Subdomain
def set_account
params[:id] ||= request.subdomains.first unless request.subdomains.blank?
@account = Account.find params[:id]
end
end
理想情况下,我们喜欢在中间件中处理这个问题,但就目前而言,这就是我们所拥有的!
这使您能够从@account
变量中调用所需的数据:
#app/views/accounts/application/show.html.erb
<%= @account.name %>