MultiClient

Features

* Blocks calls to unscoped (unless whitelisted)
* Gives you a copy of tenant specific classes with the Unscoped suffix, for unscoped access (Post => PostUnscoped).

Installation

Add it to your gemfile:

# Gemfile
gem 'multi_client'

Run the installer:

> rails generate multi_client:install

Add migrations and migrate

> rake multi_client:install:migrations && rake db:migrate

How do I scope routing to clients?

# config/routes.rb
constraints MultiClient::Subdomain do
  resources :posts
end

=> acme.example.com/posts

How do I scope routing to non-clients?

# config/routes.rb
constraints MultiClient::NoSubdomain do
  resources :posts
end

=> www.example.com/posts

How do I set the current client?

# console
MultiClient::Client.set_current_by_identifier '100'

How do I unset the current client?

# console
MultiClient::Client.unset_current

How do I execute something in the scope of a Tenant?

# console
Tenant.with_tenant(Tenant.find(1)) do
  # This call will be scoped to tenant_id = 1
  Post.all
end

How do I setup my application so that a client is looked up automatically?

# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  include MultiClient::ControllerWithClient
  helper_method :current_client
end

Gotchas

include MultiClient::ModelWithClient::ActiveSupport::Concern after calls to any class methods.

If you get errors like Paperclip complaining for missing validators or missing association, please make sure to include MultiClient::ModelWithClient::ActiveSupport::Concern after calls to any class methods

Wrong:

class Picture
  # PictureUnscoped won't pickup the validation
  include MultiClient::ModelWithClient

  validates_attachment :image, presence: true,
                              content_type: { content_type: /image\/(jpeg|png)/ }
end

Correct:

class Picture
  validates_attachment :image, presence: true,
                              content_type: { content_type: /image\/(jpeg|png)/ }

  # Including the module after the class_method call.
  include MultiClient::ModelWithClient
end

Paperclip does not find assets when using the :class interpolation

When you save an asset with paperclip and use the unscoped version of a model (i.e. PostUnscoped). The file path will include the class name with the “_unscoped ”suffix.

Trying to access this attachment with the regular, scoped version of the model fails, becuase the file path does not the “_unscoped” part.

Solution: This gem adds an interpolation called :class_without_unscoped. Use this interpolation in your url and path paperclip options instead of the origional :class_name.

License

This project rocks and uses MIT-LICENSE.