Generate route definitions for your application.
Synopsis
Copy wheels generate route [objectname] [options]
wheels g route [objectname] [options]
Description
The wheels generate route
command helps you create route definitions in your Wheels application's /config/routes.cfm
file. It can generate individual routes with different HTTP methods, RESTful resources, or root routes.
Arguments
Argument
Description
Default
The name of the resource/route to add
Options
Create a GET route (pattern,handler format)
Create a POST route (pattern,handler format)
Create a PUT route (pattern,handler format)
Create a PATCH route (pattern,handler format)
Create a DELETE route (pattern,handler format)
Create a root route with handler
Examples
Resources Route (default)
Copy wheels generate route products
Generates in /config/routes.cfm
:
Copy .resources("products")
GET Route
Copy wheels generate route get="/about,pages#about"
Generates:
Copy .get(pattern="/about", to="pages#about")
POST Route
Copy wheels generate route post="/contact,contact#send"
Generates:
Copy .post(pattern="/contact", to="contact#send")
Root Route
Copy wheels generate route root="pages#home"
Generates:
Copy .root(to="pages#home")
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
Copy <cfset get(pattern="/old-about", redirect="/about")>
<cfset get(pattern="/products/category/[name]", redirect="/categories/[name]")>
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