Multi tenant/lang application with Ruby on Rails

14

Click here to load reader

description

Slides of my "Multi tenant/lang application" at Paris.rb on 2014-03-04.

Transcript of Multi tenant/lang application with Ruby on Rails

Page 1: Multi tenant/lang application with Ruby on Rails

Multi tenant/lang applicationSimon Courtois - @happynoff

Page 2: Multi tenant/lang application with Ruby on Rails

Multi-tenant you say?

Page 3: Multi tenant/lang application with Ruby on Rails

mywebsite.com

otherwebsite.com

and-another.com

APP

Page 4: Multi tenant/lang application with Ruby on Rails

WebsiteAPP switchermiddleware

Page 5: Multi tenant/lang application with Ruby on Rails

Websiteclass Website < ActiveRecord::Base def self.current Thread.current[:website] end ! def self.current=(website) Thread.current[:website] = website end end

Website.current = Website.first !Website.current # => #<Website domain=“mywebsite.com" lang="en">

domain lang

Page 6: Multi tenant/lang application with Ruby on Rails

WebsiteAPP switcher ✔ Websitemiddleware

Page 7: Multi tenant/lang application with Ruby on Rails

switcherclass WebsiteSwitcher attr_reader :domain, :host, :website ! def initialize(host) @host = host.downcase.chomp('.') end ! def domain @domain ||= ActionDispatch::Http::URL.extract_domain(host) end ! def website @website ||= Website.where(domain: domain).first || Website.where(domain: 'mywebsite.com') end ! def switch! Website.current = website I18n.locale = website.lang end end

WebsiteSwitcher.new('www.mywebsite.com').switch!

Page 8: Multi tenant/lang application with Ruby on Rails

APP switcher✔ switcher ✔ Websitemiddleware

Page 9: Multi tenant/lang application with Ruby on Rails

require 'website_switcher' !class WebsiteSwitcherMiddleware def initialize(app) @app = app end ! def call(env) request = Rack::Request.new(env) ! WebsiteSwitcher.new(request.host).switch! ! @app.call(env) end end

middleware

Page 10: Multi tenant/lang application with Ruby on Rails

middlewareAPP ✔ switcher ✔ Website✔ middleware

Page 11: Multi tenant/lang application with Ruby on Rails

APP

require 'middlewares/website_switcher_middleware' !module AwesomeApp class Application < Rails::Application # ... ! config.middleware.use WebsiteSwitcherMiddleware end end

Page 12: Multi tenant/lang application with Ruby on Rails

APP ✔ switcher ✔ Website✔ middleware✔ APP

Page 13: Multi tenant/lang application with Ruby on Rails

Questions?

Page 14: Multi tenant/lang application with Ruby on Rails

Thank youSimon Courtois - @happynoff