This is a robust approach to making controller/{conference_name}/* case insensitive. Richard reported this issue in regards to West2026 flyer.

This commit is contained in:
Jonathan Rosenbaum 2026-03-15 08:47:42 +00:00
parent dc9665b79d
commit 69e8a29fc7
5 changed files with 16 additions and 6 deletions

View File

@ -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'

View File

@ -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

View File

@ -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"

View File

@ -0,0 +1,6 @@
class SlugConstraint
def matches?(request)
request.params[:slug] = request.params[:slug].downcase if request.params[:slug]
true
end
end

View File

@ -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