ruby-on-rails – 为不同的用户类型添加子域

我是Rails的新手,我的大部分知识都取决于教程:)

所以,我按照这个http://www.railstutorial.org教程创建了非常好的网站,但现在我遇到了一个问题.对于我的用户,我的数据库中有一个特殊列,显示他是哪种类型的用户.例如,我有专栏“学生”,如果用户是学生,则为“真”,如果不是,则为“假”.

现在我想为学生创建一个子域名.因此,当学生想要注册或登录时,他将被转移到www.student.mysite.com而不是www.mysite.com.

我怎么能做到这一点?

谢谢 :)

最佳答案 有很多方法可以做到这一点,特别是你有兴趣在rails上查找
multi-tenancy

多租户

虽然多租户通常是拥有多个数据库/资产(每个用户一个)的定义,但是,因为在rails中工作这是非常困难的(我们目前正在处理的事情),你可以使用单一原则一堆数据

有几个关于如何使用Rails实现此目的的教程:

  • 07001 (although looks like the post is down)
  • 07002
  • 07003

虽然这与您的问题没有直接关系,但大多数是“多租户”问题
通常基于“如何为我的用户创建不同的子域”

子域

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 %>
点赞