rails中的子域域管理

时间:2015-10-08 11:00:34

标签: ruby-on-rails ruby ruby-on-rails-4 routing subdomain

现在我有一个应用程序,其中包括许多东西,如狂欢,炼油厂,论坛和许多其他宝石。所以我需要为用户制作这个应用程序的克隆,并为每个应用程序创建一个子域。比如user1.mydomain.com,它导致我的应用程序的克隆只有这个克隆的专用数据库。所以现在我刚刚复制并粘贴文件夹,但这是一个非常糟糕的做法,我遇到了很多问题。所以我的问题是。我该如何实现呢?或许是我的麻烦的特殊宝石?

1 个答案:

答案 0 :(得分:1)

  

仅针对此克隆的专用数据库

这称为multi tenancy - true 多租户是您拥有多个数据库的地方 - 每个用户通过一个应用程序实例运行一个数据库。

对于Rails来说,这是一个非常技术性的观点,因为它之前没有完成。

有一些宝石 - 例如Apartment - 允许使用PGSQL scoping的一些多租户功能。有一个关于这个here的Railscast:

enter image description here

这仅适用于Postgres。如果您正在使用MYSQL,则必须创建一种加载,填充和放置的方法。每次注册新用户时都会引用各个表。不是一个平凡的壮举。

  

为用户制作此应用的副本,并为每个

创建一个子域

您不是制作应用的克隆;您需要使用一个应用程序实例,然后将其与多数据孤岛一起使用。

还有一个很棒的Railscast about the subdomains here

enter image description here

就子域名而言,您必须构建流程来处理不同的用户实例:

#config/routes.rb
root "application#index"
constraints: Subdomain do
    resources :posts, path: "" #-> user1.domain.com/ -> posts#index
end


#lib/subdomain.rb
class Subdomain
   def matches?(request)
     @users.exists? request.subdomain #-> would have to use friendly_id
   end
end

#app/controllers/application_controller.rb
class ApplicationController < ApplicationController
   def index
       # "welcome" page for entire app
       # include logic to determine whether use logged in. If so, redirect to subdomain using route URL
   end
end

#app/controllers/posts_controller.rb
class PostsController < ApplicationController
   before_action :set_user #-> also have to authenticate here

   def index
      @posts = @user.posts
   end

   private 

   def set_user
      @user = User.find request.subdomain
   end
end

这将使您能够有一个欢迎&#34;页面,管理用户登录,然后有一个中央用户&#34;他们在子域内看到他们的帖子等的区域。