Recently I was asked to separate the public from the administration portion of a web application and deploy them to different servers. I'll present a Rails application where the admin and public portions are activated based on an application running mode flag.
In order to achieve this the application components are separated in Rails engines, and I'll go trough some common pitfalls with this approach as well as discussing its long term benefits.
8. Rails.application.routes.draw do
case AppRunningMode .value
when :admin
mount AdminUi::Engine => "/"
when :public
mount PublicUi::Engine => "/"
else
mount AdminUi::Engine => "/"
mount PublicUi::Engine => "/"
end
end
config/routes.rb
10. ● are ruby gems
● are special ruby gems that provide extra
behaviour (models, views, routes, rake
tasks) to a Rails application
● they can be hosted on a gemserver or
they can live inside your repository
● can be tested in isolation
rails engines
23. Gem::Specification.new do |s|
# ... other fields up here
s.name = "public_ui"
s.add_dependency "rails", "~> 4.1.1"
s.add_dependency 'jquery-rails'
s.add_dependency 'mongoid'
s.add_runtime_dependency "admin_ui"
s.add_development_dependency'byebug'
s.add_development_dependency'database_cleaner'
s.add_development_dependency'rspec-rails', '2.99.0'
s.add_development_dependency'capybara'
s.add_development_dependency'poltergeist'
end
public_ui.gemspec
24. Gem::Specification.new do |s|
# ... other fields up here
s.name = "public_ui"
s.add_dependency "rails", "~> 4.1.1"
s.add_dependency 'jquery-rails'
s.add_dependency 'mongoid'
s.add_runtime_dependency "admin_ui"
s.add_development_dependency 'byebug'
s.add_development_dependency 'database_cleaner'
s.add_development_dependency 'rspec-rails', '2.99.0'
s.add_development_dependency 'capybara'
s.add_development_dependency 'poltergeist'
end
public_ui.gemspec
25. Rails.application.routes.draw do
case AppRunningMode .value
when :admin
mount AdminUi::Engine => "/"
when :public
mount PublicUi::Engine => "/"
else
mount AdminUi::Engine => "/"
mount PublicUi::Engine => "/"
end
end
config/routes.rb
36. Gem::Specification.new do |s|
# ... other fields up here
s.name = "admin_ui"
s.add_dependency "rails", "~> 4.1.1"
s.add_dependency 'jquery-rails'
s.add_dependency 'mongoid'
s.add_dependency 'faraday'
s.add_dependency "domain_logic"
s.add_dependency "shared_ui"
s.add_development_dependency'byebug'
s.add_development_dependency'database_cleaner'
s.add_development_dependency'rspec-rails', '2.99.0'
s.add_development_dependency'vcr'
s.add_development_dependency'webmock'
s.add_development_dependency'capybara'
s.add_development_dependency'poltergeist'
end
admin_ui.gemspec
37. Gem::Specification.new do |s|
# ... other fields up here
s.name = "admin_ui"
s.add_dependency "rails", "~> 4.1.1"
s.add_dependency 'jquery-rails'
s.add_dependency 'mongoid'
s.add_dependency 'faraday'
s.add_dependency "domain_logic"
s.add_dependency "shared_ui"
s.add_development_dependency 'byebug'
s.add_development_dependency 'database_cleaner'
s.add_development_dependency 'rspec-rails', '2.99.0'
s.add_development_dependency 'vcr'
s.add_development_dependency 'webmock'
s.add_development_dependency 'capybara'
s.add_development_dependency 'poltergeist'
end
admin_ui/admin_ui.gemspec
38. source "https://rubygems.org"
gem 'domain_logic', path: '../domain_logic'
gem 'shared_ui', path: '../shared_ui'
# Declare your gem's dependencies in admin_ui.gemspec.
# Bundler will treat runtime dependencies like base
dependencies, and
# development dependencies will be added by default to
the :development group.
gemspec
admin_ui/Gemfile