ruby 27 lines · 7 steps

How URL slugs work in Rails

An Article generates a unique, URL-safe slug before validation and uses it in route helpers.

Explained by highlit
1class Article < ApplicationRecord
2 before_validation :generate_slug, on: :create
3 
4 validates :slug, presence: true, uniqueness: true,
5 format: { with: /\A[a-z0-9]+(?:-[a-z0-9]+)*\z/ }
6 
7 def to_param
8 slug
9 end
10 
11 private
12 
13 def generate_slug
14 return if slug.present? || title.blank?
15 
16 base = title.parameterize
17 candidate = base
18 suffix = 2
19 
20 while self.class.where(slug: candidate).exists?
21 candidate = "#{base}-#{suffix}"
22 suffix += 1
23 end
24 
25 self.slug = candidate
26 end
27end
01 / 01
STEP 01

Walkthrough

Space play step click any line
Three takeaways
  1. 1A before_validation callback lets you derive a field before the same field's validations run.
  2. 2Looping while a uniqueness query matches guarantees a collision-free slug at generation time.
  3. 3Overriding to_param makes Rails route helpers use a readable identifier instead of the numeric id.

Related explainers

Share this explainer

Here's the card — post it anywhere.

How URL slugs work in Rails — share card
Made with highlit — turn any snippet into a walkthrough like this in about a minute.
Explain your code