From 69e8a29fc7579638ecc81eb7a9a643b3903d23d8 Mon Sep 17 00:00:00 2001 From: Jonathan Rosenbaum Date: Sun, 15 Mar 2026 08:47:42 +0000 Subject: [PATCH] This is a robust approach to making controller/{conference_name}/* case insensitive. Richard reported this issue in regards to West2026 flyer. --- app/controllers/administration_controller.rb | 2 +- app/controllers/application_controller.rb | 6 +++--- app/controllers/conference_administration_controller.rb | 2 +- config/initializers/slug_constraint.rb | 6 ++++++ config/routes.rb | 6 +++++- 5 files changed, 16 insertions(+), 6 deletions(-) create mode 100644 config/initializers/slug_constraint.rb diff --git a/app/controllers/administration_controller.rb b/app/controllers/administration_controller.rb index 4c5d980..86a53cf 100644 --- a/app/controllers/administration_controller.rb +++ b/app/controllers/administration_controller.rb @@ -9,7 +9,7 @@ class AdministrationController < ApplicationController def edit return do_404 unless logged_in? && current_user.administrator? - @this_conference = Conference.find_by!(slug: params[:slug]) + @this_conference = Conference.find_by!("LOWER(slug) = LOWER(?)", params[:slug]) @page_title = 'articles.conferences.headings.edit' @main_title_vars = { vars: { title: @this_conference.title } } render 'new' diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index f26b84d..5c3a05c 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -123,7 +123,7 @@ class ApplicationController < BaseController @page_title ||= 'page_titles.403.Please_Check_Email' if (request.present? && request.referrer.present? && conference = /^\/conferences\/(\w+)\/register\/?$/.match(request.referrer.gsub(/^https?:\/\/.*?\//, '/'))) - @this_conference = Conference.find_by!(slug: conference[1]) + @this_conference = Conference.find_by!("LOWER(slug) = LOWER(?)", conference[1]) @banner_image = @this_conference.cover_url template = 'conferences/email_confirm' end @@ -283,7 +283,7 @@ class ApplicationController < BaseController @page_title ||= 'page_titles.403.Please_Check_Email' if (request.present? && request.referrer.present? && conference = /^\/conferences\/(\w+)\/register\/?$/.match(request.referrer.gsub(/^https?:\/\/.*?\//, '/'))) - @this_conference = Conference.find_by!(slug: conference[1]) + @this_conference = Conference.find_by!("LOWER(slug) = LOWER(?)", conference[1]) @banner_image = @this_conference.cover_url template = 'conferences/email_confirm' end @@ -617,7 +617,7 @@ class ApplicationController < BaseController protected def set_conference - @this_conference = Conference.find_by!(slug: params[:slug]) + @this_conference = Conference.find_by!("LOWER(slug) = LOWER(?)", params[:slug]) end def set_conference_registration diff --git a/app/controllers/conference_administration_controller.rb b/app/controllers/conference_administration_controller.rb index 7ac93b1..f7199ee 100644 --- a/app/controllers/conference_administration_controller.rb +++ b/app/controllers/conference_administration_controller.rb @@ -76,7 +76,7 @@ class ConferenceAdministrationController < ApplicationController def previous_stats set_conference - conference = Conference.find_by_slug(params[:conference_slug]) + conference = Conference.find_by("LOWER(slug) = LOWER(?)", params[:conference_slug]) return do_403 unless conference.is_public get_stats(false, nil, conference) logger.info "Generating #{conference.slug}.xls" diff --git a/config/initializers/slug_constraint.rb b/config/initializers/slug_constraint.rb new file mode 100644 index 0000000..bd31ab5 --- /dev/null +++ b/config/initializers/slug_constraint.rb @@ -0,0 +1,6 @@ +class SlugConstraint + def matches?(request) + request.params[:slug] = request.params[:slug].downcase if request.params[:slug] + true + end +end diff --git a/config/routes.rb b/config/routes.rb index c51aae3..1d4a80a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -3,6 +3,10 @@ Sidekiq::Web.set :sessions, false BikeBike::Application.routes.draw do + # Redirect uppercase CONFERENCES to lowercase conferences + get '/CONFERENCES(*anything)', to: redirect { |params, request| "/conferences#{params[:anything]}" } + get '/CONFERENCES', to: redirect('/conferences') + # Conferences scope :conferences do root 'conferences#list', as: :conferences @@ -10,7 +14,7 @@ BikeBike::Application.routes.draw do get 'new' => 'administration#new', as: :new_conference post 'save' => 'administration#save', as: :save_conference - scope ':slug', constraints: { slug: /[^\/]+/ } do + scope ':slug', constraints: SlugConstraint.new do root 'conferences#view', as: :conference get 'edit' => 'administration#edit', as: :edit_conference