Generate route definitions for your application.
Synopsis
Copy wheels generate route [pattern] [options]
wheels g route [pattern] [options]
Description
The wheels generate route
command helps you create route definitions in your Wheels application. It can generate individual routes, RESTful resources, nested routes, and complex routing patterns while maintaining proper syntax and organization in your routes file.
Arguments
Argument
Description
Default
Route pattern or resource name
Options
Controller#action destination
Required for non-resource
HTTP method (GET, POST, PUT, DELETE)
Route name for URL helpers
Generate RESTful resource routes
Generate API routes (no new/edit)
Parent resource for nesting
Only include specific actions
Examples
Basic Route
Copy wheels generate route "/about" --to="pages#about" --name="about"
Generates in /config/routes.cfm
:
Copy <cfset get(name="about", pattern="/about", to="pages##about")>
POST Route
Copy wheels generate route "/contact" --to="contact#send" --method="POST" --name="sendContact"
Generates:
Copy <cfset post(name="sendContact", pattern="/contact", to="contact##send")>
RESTful Resource
Copy wheels generate route products --resource
Generates:
Copy <cfset resources("products")>
This creates all standard routes:
GET /products/:key (show)
GET /products/:key/edit (edit)
PUT/PATCH /products/:key (update)
DELETE /products/:key (delete)
API Resource
Copy wheels generate route products --api
Generates:
Copy <cfset resources(name="products", nested=false, except="new,edit")>
Nested Resources
Copy wheels generate route comments --resource --nested="posts"
Generates:
Copy <cfset resources("posts")>
<cfset resources("comments")>
</cfset>
Creates routes like:
/posts/:postKey/comments/:key
Route Patterns
Dynamic Segments
Copy wheels generate route "/users/[key]/profile" --to="users#profile" --name="userProfile"
Generates:
Copy <cfset get(name="userProfile", pattern="/users/[key]/profile", to="users##profile")>
Optional Segments
Copy wheels generate route "/blog/[year]/[month?]/[day?]" --to="blog#archive" --name="blogArchive"
Generates:
Copy <cfset get(name="blogArchive", pattern="/blog/[year]/[month?]/[day?]", to="blog##archive")>
Wildcards
Copy wheels generate route "/docs/*" --to="documentation#show" --name="docs"
Generates:
Copy <cfset get(name="docs", pattern="/docs/*", to="documentation##show")>
Advanced Routing
With Constraints
Copy wheels generate route "/users/[id]" --to="users#show" --constraints="id=[0-9]+"
Generates:
Copy <cfset get(pattern="/users/[id]", to="users##show", constraints={id="[0-9]+"})>
Namespace Routes
Copy wheels generate route users --resource --namespace="admin"
Generates:
Copy <cfset namespace("admin")>
<cfset resources("users")>
</cfset>
Module Routes
Copy wheels generate route dashboard --resource --namespace="admin" --module="backend"
Generates:
Copy <cfset module("backend")>
<cfset namespace("admin")>
<cfset resources("dashboard")>
</cfset>
</cfset>
Shallow Nesting
Copy wheels generate route comments --resource --nested="posts" --shallow
Generates:
Copy <cfset resources("posts")>
<cfset resources(name="comments", shallow=true)>
</cfset>
Custom Actions
Member Routes
Copy wheels generate route "products/[key]/activate" --to="products#activate" --method="PUT" --member
Generates:
Copy <cfset resources("products")>
<cfset put(pattern="[key]/activate", to="products##activate", on="member")>
</cfset>
Collection Routes
Copy wheels generate route "products/search" --to="products#search" --collection
Generates:
Copy <cfset resources("products")>
<cfset get(pattern="search", to="products##search", on="collection")>
</cfset>
Route Files Organization
Main Routes File
/config/routes.cfm
:
Copy <!---
Routes Configuration
Define your application routes below
--->
<!--- Public routes --->
<cfset get(name="home", pattern="/", to="main##index")>
<cfset get(name="about", pattern="/about", to="pages##about")>
<cfset get(name="contact", pattern="/contact", to="pages##contact")>
<cfset post(name="sendContact", pattern="/contact", to="pages##sendContact")>
<!--- Authentication --->
<cfset get(name="login", pattern="/login", to="sessions##new")>
<cfset post(name="createSession", pattern="/login", to="sessions##create")>
<cfset delete(name="logout", pattern="/logout", to="sessions##delete")>
<!--- Resources --->
<cfset resources("products")>
<cfset resources("categories")>
<!--- API routes --->
<cfset namespace("api")>
<cfset namespace("v1")>
<cfset resources(name="products", nested=false, except="new,edit")>
<cfset resources(name="users", nested=false, except="new,edit")>
</cfset>
</cfset>
<!--- Admin routes --->
<cfset namespace("admin")>
<cfset get(name="adminDashboard", pattern="/", to="dashboard##index")>
<cfset resources("users")>
<cfset resources("products")>
<cfset resources("orders")>
</cfset>
<!--- Catch-all route --->
<cfset get(pattern="*", to="errors##notFound")>
Route Helpers
Generated routes create URL helpers:
Basic Helpers
Copy <!--- For route: get(name="about", pattern="/about", to="pages##about") --->
#linkTo(route="about", text="About Us")#
#urlFor(route="about")#
#redirectTo(route="about")#
Resource Helpers
Copy <!--- For route: resources("products") --->
#linkTo(route="products", text="All Products")# <!--- /products --->
#linkTo(route="product", key=product.id, text="View")# <!--- /products/123 --->
#linkTo(route="newProduct", text="Add Product")# <!--- /products/new --->
#linkTo(route="editProduct", key=product.id, text="Edit")# <!--- /products/123/edit --->
#urlFor(route="products")# <!--- /products --->
#urlFor(route="product", key=123)# <!--- /products/123 --->
Nested Resource Helpers
Copy <!--- For nested resources("posts") > resources("comments") --->
#linkTo(route="postComments", postKey=post.id, text="Comments")# <!--- /posts/1/comments --->
#linkTo(route="postComment", postKey=post.id, key=comment.id, text="View")# <!--- /posts/1/comments/5 --->
Route Constraints
Pattern Constraints
Copy wheels generate route "/posts/[year]/[month]" --to="posts#archive" --constraints="year=[0-9]{4},month=[0-9]{2}"
Copy wheels generate route "/api/users" --to="api/users#index" --format="json"
Generates:
Copy <cfset get(pattern="/api/users", to="api/users##index", format="json")>
Route Testing
Generate Route Tests
Copy wheels generate route products --resource
wheels generate test routes products
Route Test Example
Copy component extends="wheels.Test" {
function test_products_routes() {
// Test index route
result = $resolve(path="/products", method="GET");
assert(result.controller == "products");
assert(result.action == "index");
// Test show route
result = $resolve(path="/products/123", method="GET");
assert(result.controller == "products");
assert(result.action == "show");
assert(result.params.key == "123");
// Test create route
result = $resolve(path="/products", method="POST");
assert(result.controller == "products");
assert(result.action == "create");
}
}
Route Debugging
List All Routes
Test Specific Route
Copy wheels routes test "/products/123" --method=GET
Output:
Copy Route resolved:
Controller: products
Action: show
Params: {key: "123"}
Name: product
Best Practices
Order matters : Place specific routes before generic ones
Use RESTful routes : Prefer resources()
over individual routes
Name your routes : Always provide names for URL helpers
Group related routes : Use namespaces and modules
Add constraints : Validate dynamic segments
Document complex routes : Add comments explaining purpose
Test route resolution : Ensure routes work as expected
Common Patterns
Authentication Required
Copy <!--- Public routes --->
<cfset get(name="home", pattern="/", to="main##index")>
<!--- Authenticated routes --->
<cfset namespace(name="authenticated", path="/app")>
<!--- All routes here require authentication --->
<cfset resources("projects")>
<cfset resources("tasks")>
</cfset>
API Versioning
Copy <cfset namespace("api")>
<cfset namespace(name="v1", path="/v1")>
<cfset resources(name="users", except="new,edit")>
</cfset>
<cfset namespace(name="v2", path="/v2")>
<cfset resources(name="users", except="new,edit")>
</cfset>
</cfset>
Subdomain Routing
Copy <cfset subdomain("api")>
<cfset resources("products")>
</cfset>
<cfset subdomain("admin")>
<cfset resources("users")>
</cfset>
Redirect Routes
Route caching : Routes are cached in production
Minimize regex : Complex patterns slow routing
Avoid wildcards : Be specific when possible
Order efficiently : Most-used routes first
Troubleshooting
Route Not Found
Test with wheels routes test
Check for typos in pattern
Naming Conflicts
Ensure unique route names
Check for duplicate patterns
Use namespaces to avoid conflicts
Parameter Issues
Verify parameter names match
Check constraint patterns
See Also