Skip to content

Instantly share code, notes, and snippets.

@bogdan
Created January 20, 2026 09:20
Show Gist options
  • Select an option

  • Save bogdan/ee68864c288b05128bd9c902672381f0 to your computer and use it in GitHub Desktop.

Select an option

Save bogdan/ee68864c288b05128bd9c902672381f0 to your computer and use it in GitHub Desktop.

Here’s a minimal, idiomatic Rails example wiring Current.organization into your routes and URL generation using your scoped routes.


1. Current

class Current < ActiveSupport::CurrentAttributes
  attribute :organization
end

2. Routes

Rails.application.routes.draw do
  scope(
    path: "(/o/:organization_path)",
    constraints: {
      organization_path: Gitlab::PathRegex.organization_route_regex
    }
  ) do
    draw_all_routes
  end
end

This means every route can optionally be prefixed with:

/o/:organization_path

3. Load organization into Current

class ApplicationController < ActionController::Base
  before_action :set_current_organization

  private

  def set_current_organization
    return unless params[:organization_path]

    Current.organization = Organization.find_by!(
      path: params[:organization_path]
    )
  end
end

4. default_url_options using Current.organization

class ApplicationController < ActionController::Base
  def default_url_options
    return {} unless Current.organization

    {
      organization_path: Current.organization.path
    }
  end
end

Now all *_url helpers automatically include /o/:organization_path.


5. Resulting behavior

projects_url

Generates:

https://example.com/o/acme/projects

If Current.organization is nil:

https://example.com/projects

6. Controllers / views / redirects

All of these now work automatically:

redirect_to project_url(@project)
link_to "Projects", projects_path

7. Mailers

class ApplicationMailer < ActionMailer::Base
  def default_url_options
    return {} unless Current.organization

    {
      organization_path: Current.organization.path
    }
  end
end

8. Background jobs

class ExampleJob < ApplicationJob
  def perform(organization_id)
    Current.organization = Organization.find(organization_id)
    ProjectsController.helpers.projects_url
  ensure
    Current.reset
  end
end

Key properties of this setup

  • Optional org prefix works transparently
  • No global mutation
  • Thread-safe
  • Matches GitLab-style routing
  • _path and _url both behave correctly

If you want, I can also show:

  • enforcing org presence for certain controllers
  • how to fall back to subdomain instead of /o/:path
  • preventing route generation without Current.organization
  • test helpers for this pattern
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment