Object Relational Mapping
Creating Records
Reading Records
Updating Records
Deleting Records
Column Statistics
Dynamic Finders
Getting Paginated Data
Associations
Nested Properties
Object Validation
Object Callbacks
Calculated Properties
Transactions
Dirty Records
Soft Delete
Automatic Time Stamps
Using Multiple Data Sources
wheels generate route
Generate route definitions for your Wheels application's /config/routes.cfm
file.
Synopsis
wheels generate route [objectname]
#can also be used as:
wheels g route [objectname]
# HTTP method routes
wheels generate route --get="pattern,controller##action"
wheels generate route --post="pattern,controller##action"
wheels generate route --put="pattern,controller##action"
wheels generate route --patch="pattern,controller##action"
wheels generate route --delete="pattern,controller##action"
# Root route
wheels generate route --root="controller##action"
# Resources route (explicit)
wheels generate route --resources=true [objectname]
Description
The wheels generate route
command helps you create route definitions in your Wheels application's /config/routes.cfm
file. It supports individual HTTP method routes, RESTful resource routes, and root routes.
IMPORTANT: All HTTP method parameters must use the equals syntax: --get="pattern,handler"
not --get pattern,handler
Parameter Syntax
CommandBox supports multiple parameter formats:
- Named parameters:
name=value
(e.g.,objectname=products
,get="pattern,handler"
) - Flag parameters:
--flag
equalsflag=true
(e.g.,--resources
equalsresources=true
) - Flag with value:
--flag=value
equalsflag=value
(e.g.,--get="pattern,handler"
)
Note: Flag syntax (--flag
) avoids positional/named parameter conflicts and is recommended for boolean options.
Arguments
| Argument | Description | Default |
|----------|-------------|---------|
| objectname
| The name of the resource for resources route | Optional (required for resources routes) |
Options
| Option | Description | Example | Default |
|--------|-------------|---------|---------|
| --get
| Create a GET route with pattern,handler format | --get="products/sale,products##sale"
| |
| --post
| Create a POST route with pattern,handler format | --post="contact,contact##send"
| |
| --put
| Create a PUT route with pattern,handler format | --put="users/[key],users##update"
| |
| --patch
| Create a PATCH route with pattern,handler format | --patch="profiles,profiles##update"
| |
| --delete
| Create a DELETE route with pattern,handler format | --delete="sessions,sessions##destroy"
| |
| --resources
| Create a resources route (use with objectname) | --resources=true
| false
|
| --root
| Create a root route with handler | --root="pages##home"
| |
Examples
Resources Route (default)
wheels generate route products
Generates in /config/routes.cfm
:
.resources("products")
This creates all standard RESTful routes:
- GET
/products
(index) - GET
/products/new
(new) - POST
/products
(create) - GET
/products/[key]
(show) - GET
/products/[key]/edit
(edit) - PUT/PATCH
/products/[key]
(update) - DELETE
/products/[key]
(delete)
GET Route
wheels generate route --get="products/sale,products##sale"
Generates:
.get(pattern="products/sale", to="products##sale")
POST Route
wheels generate route --post="api/users,api.users##create"
Generates:
.post(pattern="api/users", to="api.users##create")
PUT Route
wheels generate route --put="users/[key]/activate,users##activate"
Generates:
.put(pattern="users/[key]/activate", to="users##activate")
DELETE Route
wheels generate route --delete="sessions,sessions##destroy"
Generates:
.delete(pattern="sessions", to="sessions##destroy")
Root Route
wheels generate route --root="pages##home"
Generates:
.root(to="pages##home", method="get")
Explicit Resources Route
wheels generate route --resources=true users
Generates:
.resources("users")
Route Patterns
Dynamic Segments
Routes support dynamic segments using [key]
notation:
wheels generate route --get="users/[key]/profile,users##profile"
Generates:
.get(pattern="users/[key]/profile", to="users##profile")
The [key]
parameter will be available as params.key
in your controller.
Custom Parameters
You can use any parameter name:
wheels generate route --get="posts/[year]/[month],posts##archive"
Generates:
.get(pattern="posts/[year]/[month]", to="posts##archive")
Parameters will be available as params.year
and params.month
in your controller.
Pattern Only Routes
If you omit the handler, the route will use standard controller/action mapping:
wheels generate route --get="products/search"
Generates:
.get(pattern="products/search")
This will map to the search
action in the products
controller.
Route File Integration
Generated Routes Location
All routes are added to /config/routes.cfm
at the CLI marker position:
<cfscript>
mapper()
.resources("products") // Existing routes
.get(pattern="about", to="pages#about") // Existing routes
// CLI-Appends-Here // CLI adds new routes here
.wildcard() // Wildcard should stay last
.root(to="home#index") // Root route
.end();
</cfscript>
Route Order
The command automatically places new routes at the correct position before the wildcard route. Routes are processed in order, so specific routes must come before general ones.
Using Generated Routes
Route Helpers
Resource routes automatically create URL helpers:
<!--- For resources("products") --->
#linkTo(route="products", text="All Products")# <!-- /products -->
#linkTo(route="product", key=123, text="View")# <!-- /products/123 -->
#linkTo(route="newProduct", text="Add Product")# <!-- /products/new -->
#linkTo(route="editProduct", key=123, text="Edit")# <!-- /products/123/edit -->
#urlFor(route="products")# <!-- /products -->
#urlFor(route="product", key=123)# <!-- /products/123 -->
Custom Route Helpers
For custom routes, you'll need to manually create route names in your routes.cfm:
<!--- Add name parameter manually in routes.cfm --->
.get(name="productSale", pattern="products/sale", to="products##sale")
<!--- Then use in views --->
#linkTo(route="productSale", text="Special Sale")#
Detailed Parameter Usage
Command Line Parameter Formats
Building on CommandBox's parameter syntax, CFWheels route generation supports:
1. Named Parameters (Recommended)
wheels generate route --get="products/sale,products##sale"
wheels generate route --post="contact/send,contact##send"
wheels generate route --resources=true --objectname=users
wheels generate route --root="pages##home"
2. Positional Parameters
wheels generate route products # objectname (resources route)
wheels g route users # Short alias with objectname
3. Mixed Parameters
wheels generate route users --resources=true
wheels generate route --objectname=products --resources=true
Parameter Validation Rules
HTTP Method Parameters
- Format:
--method="pattern,handler"
or--method="pattern"
- Methods:
get
,post
,put
,patch
,delete
- Separator: Comma (
,
) between pattern and handler - Quotes: Always use quotes around the value
- Handler Format:
controller##action
(double hash required in CFML)
Resources Parameters
- Format:
--resources=true objectname
orobjectname --resources=true
- Boolean: Must be explicit
true
orfalse
- Objectname: Required when using resources flag
Root Parameters
- Format:
--root="controller##action"
- Handler: Required controller and action
- Quotes: Always use quotes
Parameter Examples by Type
String Parameters with Handlers
# GET route with handler
wheels generate route --get="api/users,api##index"
# POST route with handler
wheels generate route --post="users/login,sessions##create"
# PUT route with handler
wheels generate route --put="profiles/[key],profiles##update"
String Parameters without Handlers
# Pattern-only routes (uses convention)
wheels generate route --get="products/search"
wheels generate route --post="newsletter/signup"
Boolean Parameters
# Resources flag (explicit true/false)
wheels generate route --resources=true products
wheels generate route --resources=false # Invalid - needs objectname
Mixed Parameter Combinations
# Objectname with resources flag
wheels generate route products --resources=true
wheels generate route --resources=true users
# Multiple routes in sequence
wheels generate route --get="login,sessions##new"
wheels generate route --post="login,sessions##create"
wheels generate route --delete="logout,sessions##destroy"
Common Parameter Mistakes
❌ Missing equals sign:
wheels generate route --get products/sale,products##sale
❌ Missing quotes:
wheels generate route --get=products/sale,products##sale
❌ Single hash instead of double:
wheels generate route --get="products/sale,products#sale"
❌ Missing objectname with resources:
wheels generate route --resources=true # No objectname
✅ Correct formats:
wheels generate route --get="products/sale,products##sale"
wheels generate route products --resources
wheels generate route --root="pages##home"
wheels generate route users # Positional objectname
Advanced Parameter Usage
Dynamic URL Segments
# Single parameter
wheels generate route --get="users/[key],users##show"
# Multiple parameters
wheels generate route --get="posts/[year]/[month],posts##archive"
# Optional parameters (configure manually in routes.cfm)
wheels generate route --get="blog/[category]" # Add [category?] manually
API-Style Routes
# RESTful API endpoints
wheels generate route --get="api/v1/users,api.v1.users##index"
wheels generate route --post="api/v1/users,api.v1.users##create"
wheels generate route --put="api/v1/users/[key],api.v1.users##update"
wheels generate route --delete="api/v1/users/[key],api.v1.users##destroy"
Namespace-Style Controllers
# Admin controllers
wheels generate route --get="admin/dashboard,admin.dashboard##index"
wheels generate route --get="admin/users,admin.users##index"
# Module-based controllers
wheels generate route --get="shop/products,shop.products##index"
wheels generate route --post="shop/checkout,shop.checkout##process"
Parameter Processing Details
Command Line Processing
- Quoted Parameters: Preserve spaces and special characters
- Equals Processing: Splits parameter name from value
- Boolean Conversion: Converts "true"/"false" strings to boolean values
- Array Processing: CommandBox processes space-separated values as arrays
Internal Parameter Handling
- reconstructArgs(): Processes CommandBox parameter format
- Validation: Checks required parameters are present
- Route Generation: Formats parameters for CFWheels router syntax
- File Injection: Places routes at correct position in routes.cfm
Integration with Routes.cfm
CLI Marker
The command looks for // CLI-Appends-Here
comment to place new routes. If not found, it tries different indentation levels:
// CLI-Appends-Here
(3 tabs)// CLI-Appends-Here
(2 tabs)// CLI-Appends-Here
(1 tab)// CLI-Appends-Here
(no tabs)
Manual Route Organization
After using the CLI, you may want to reorganize routes manually:
<cfscript>
mapper()
// Public pages first
.get(pattern="about", to="pages##about")
.get(pattern="contact", to="contact##index")
// Resources grouped together
.resources("products")
.resources("users")
// Authentication routes
.get(pattern="login", to="sessions##new")
.post(pattern="login", to="sessions##create")
// CLI generated routes will appear here
// CLI-Appends-Here
.wildcard() // Always keep wildcard last
.root(to="home##index", method="get")
.end();
</cfscript>
Best Practices
- Use equals syntax: Always use
--get="pattern,handler"
format - Resources for CRUD: Use resources route for full CRUD operations
- Custom routes for special actions: Use HTTP method routes for non-CRUD actions
- Check route order: Specific routes before general ones
- Test after generation: Visit URLs to ensure routes work
- Reload application: Use
?reload=true
after route changes
Troubleshooting
Common Issues and Solutions
1. Parameter Syntax Errors
Issue: "Missing argument"
errors when using HTTP method parameters
❌ Incorrect:
wheels generate route --get products/sale,products##sale # Missing =
wheels generate route --post contact send # Missing quotes and =
✅ Correct:
wheels generate route --get="products/sale,products##sale" # With = and quotes
wheels generate route --post="contact,sessions##create" # Proper format
Solution: Always use equals syntax with quotes for HTTP method parameters.
2. CFML Syntax Errors
Issue: Template compilation errors with single hash (#
) in handlers
❌ Incorrect:
wheels generate route --get="users,users#show" # Single # causes CFML errors
✅ Correct:
wheels generate route --get="users,users##show" # Double ## for CFML escaping
Solution: Always use double hash (##
) in controller##action handlers.
3. Routes Not Working
Issue: Generated routes don't respond or show 404 errors
Possible Causes:
- Application not reloaded after route changes
- Route order conflicts (specific routes after wildcard)
- Controller or action doesn't exist
Solutions:
# 1. Always reload after route changes
http://localhost:8080/?reload=true
# 2. Check route order in routes.cfm
# Ensure wildcard() comes AFTER specific routes
# 3. Verify controller exists
# For route: --get="products,products##sale"
# Need: /app/controllers/Products.cfc with sale() function
4. Parameter Parsing Issues
Issue: Complex patterns not parsed correctly
❌ Problematic:
# Spaces in patterns without quotes
wheels generate route --get=api/v1/users,api##index
# Special characters not escaped
wheels generate route --get="api-users,api#index"
✅ Solutions:
# Always quote complex patterns
wheels generate route --get="api/v1/users,api##index"
# Use proper CFML escaping
wheels generate route --get="api-users,api##index"
5. Resources Route Issues
Issue: Resources flag not working or missing objectname
❌ Common Mistakes:
wheels generate route --resources=true # Missing objectname
wheels generate route --resources products # Missing =true
wheels generate route products --resource # Wrong flag name
✅ Correct Usage:
wheels generate route --resources=true products # Explicit flag with objectname
wheels generate route products --resources=true # Alternative order
wheels generate route products # Default resources (implicit)
6. Route Placement Issues
Issue: Routes added in wrong location or break existing routes
Common Problems:
- CLI marker
// CLI-Appends-Here
not found - Routes added after wildcard route
- Malformed routes.cfm syntax
Solutions:
<!-- Ensure routes.cfm has proper structure -->
<cfscript>
mapper()
// Existing routes
.resources("products")
// CLI marker for new routes
// CLI-Appends-Here
// Wildcard MUST be last
.wildcard()
// Root route
.root(to="home##index", method="get")
.end(); // Don't forget .end()!
</cfscript>
Validation and Testing
Pre-Generation Checklist
Before generating routes, verify:
# 1. Check current directory is Wheels app root
ls config/routes.cfm # Should exist
# 2. Verify routes.cfm has CLI marker
grep "CLI-Appends-Here" config/routes.cfm # Should find marker
# 3. Check routes.cfm syntax is valid
# Look for proper mapper() and .end() structure
Post-Generation Validation
After generating routes, always:
# 1. Reload application
http://localhost:8080/?reload=true
# 2. Test route in browser
http://localhost:8080/your-new-route
# 3. Check debug footer for route information
# Look for your new route in the Routes section
Testing Generated Routes
# Test different HTTP methods
curl -X GET http://localhost:8080/api/users
curl -X POST http://localhost:8080/api/users -d "name=test"
curl -X PUT http://localhost:8080/api/users/1 -d "name=updated"
curl -X DELETE http://localhost:8080/api/users/1
Error Reference
Common Error Messages
"Please provide either an objectname for a resources route or specify a route type"
- Cause: No parameters provided to command
- Solution: Provide either objectname or HTTP method parameter
"key [TYPE] doesn't exist"
- Cause: Internal processing error (rare)
- Solution: Try simpler route first, then add complexity
"Template compilation error"
- Cause: Single hash (
#
) in generated route - Solution: Check for double hash (
##
) in all handlers
"Route not found" (404 errors)
- Cause: Route not added or application not reloaded
- Solution: Check routes.cfm and reload application
Best Practices for Avoiding Issues
1. Parameter Formatting
# Always use consistent formatting
wheels generate route --get="pattern,handler" # ✅ Consistent
wheels generate route --get pattern,handler # ❌ Inconsistent
2. Route Planning
# Plan route structure before generating
# 1. Resources routes first
wheels generate route products
wheels generate route users
# 2. Custom routes second
wheels generate route --get="search,search##index"
wheels generate route --post="contact,contact##send"
# 3. API routes with namespace pattern
wheels generate route --get="api/products,api.products##index"
3. Testing Strategy
# Generate one route at a time
wheels generate route --get="test,test##index"
# Test it works
curl http://localhost:8080/test
# Then generate next route
4. Documentation
# Document custom routes in routes.cfm
.get(name="productSearch", pattern="products/search", to="products##search")
// Custom search endpoint for products - returns JSON
Getting Help
If you encounter issues not covered here:
- Check the debug footer: Shows all registered routes
- Verify controller exists: Match route handler to actual controller/action
- Test with simple routes first: Basic patterns before complex ones
- Check CFWheels routing guide: For advanced routing features
- Reload frequently: Always reload after route changes
See Also
- wheels generate scaffold - Generate complete CRUD with routes
- wheels generate controller - Generate controllers
- wheels generate model - Generate models
- CFWheels Routing Guide - Complete routing documentation
- Synopsis
- Parameter Syntax
- Arguments
- Options
- Examples
- Resources Route (default)
- GET Route
- POST Route
- PUT Route
- DELETE Route
- Root Route
- Explicit Resources Route
- Route Patterns
- Dynamic Segments
- Custom Parameters
- Pattern Only Routes
- Route File Integration
- Generated Routes Location
- Route Order
- Using Generated Routes
- Route Helpers
- Custom Route Helpers
- Detailed Parameter Usage
- Command Line Parameter Formats
- Parameter Validation Rules
- Parameter Examples by Type
- Common Parameter Mistakes
- Advanced Parameter Usage
- Parameter Processing Details
- Integration with Routes.cfm
- CLI Marker
- Manual Route Organization
- Best Practices
- Troubleshooting
- Common Issues and Solutions
- Validation and Testing
- Error Reference
- Best Practices for Avoiding Issues
- Getting Help
- See Also