# Terminal puma-dev link -n example . pkill -USR1 puma-dev && puma-dev -install && tail -f log/development.log





# application_controller.rb class ApplicationController < ActionController::Base protect_from_forgery with: :exception before_action :ensure_subdomain def current_blog @current_blog ||= Blog.find_by(subdomain: request.subdomain) end helper_method :current_blog private def ensure_subdomain redirect_to root_url(subdomain: :www) unless current_blog.present? end end





# routes.rb Rails.application.routes.draw do constraints(SubdomainRoutes) do resources :blogs, only: [:new] root 'welcome#index' end constraints(!SubdomainRoutes) do resources :blogs, except: [:index, :new] do resources :posts end root 'blogs#show' end end





# config/initializers/subdomain_routes.rb class SubdomainRoutes def self.matches? request case request.subdomain when '', 'www' true else false end end end





# blogs_controller.rb class BlogsController < ApplicationController before_action :set_blog, only: [:show, :edit, :update, :destroy] skip_before_action :ensure_subdomain, only: [:new, :create] def show end def new @blog = Blog.new end def edit end def create @blog = Blog.new(blog_params) if @blog.save redirect_to root_path, notice: 'Blog was successfully created.' else render :new end end def update if @blog.update(blog_params) redirect_to root_path, notice: 'Blog was successfully updated.' else render :edit end end def destroy @blog.destroy redirect_to root_url(subdomain: nil), notice: 'Blog was successfully destroyed.' end private def set_blog @blog = current_blog end def blog_params params.require(:blog).permit(:name, :subdomain) end end





# welcome_controller.rb class WelcomeController < ApplicationController skip_before_action :ensure_subdomain def index @blogs = Blog.all end end





# models/blog.rb class Blog < ApplicationRecord validates :subdomain, exclusion: { in: %w(www), message: "%{value} is reserved." }, presence: true, uniqueness: true before_validation :sanitize_subdomain has_many :posts private def sanitize_subdomain self.subdomain = self.subdomain.parameterize end end





# blogs/show.html.erb <%= link_to 'Blog Home', root_path, class: 'btn btn-info' %> <%= link_to 'Site Home', root_url(subdomain: nil), class: 'btn btn-info' %>





# welcome/index.html.erb <%= link_to "#{blog.subdomain}.example.dev", root_url(subdomain: blog.subdomain) %>