Routing
Routes map HTTP requests to controller actions. Define your application's URL structure in config/routes.soli.
HTTP Methods
Use these helpers to define routes for different HTTP methods:
| Method | Description | Example |
|---|---|---|
| get | Retrieve a resource | get("/users", "users#index") |
| post | Create a new resource | post("/users", "users#create") |
| put | Update a resource completely | put("/users/:id", "users#update") |
| patch | Update a resource partially | patch("/users/:id", "users#patch") |
| delete | Delete a resource | delete("/users/:id", "users#delete") |
Basic Routes
config/routes.soli
// Root page
get("/", "home#index");
// Static pages
get("/about", "home#about");
get("/contact", "home#contact");
// Form submissions
post("/contact", "home#submit_contact");
Route Parameters
Use :param_name to capture dynamic segments:
config/routes.soli
// Capture user ID
get("/users/:id", "users#show");
// Multiple parameters
get("/posts/:post_id/comments/:comment_id", "comments#show");
// Optional parameters
get("/users/:id?", "users#show");
Access parameters in your controller:
app/controllers/users_controller.soli
fn show(req: Any) -> Any {
let user_id = req["params"]["id"];
let post_id = req["params"]["post_id"];
return {
"status": 200,
"body": "User ID: " + user_id
};
}
Query Parameters
Query strings are automatically parsed and available in req["query"]:
app/controllers/search_controller.soli
// URL: /search?q=solilang&page=1
fn search(req: Any) -> Any {
let query = req["query"]["q"]; // "solilang"
let page = req["query"]["page"]; // "1"
return {
"status": 200,
"body": "Searching for: " + query
};
}
RESTful Resources
Generate standard CRUD routes automatically with resources():
resources("users", null);
| Method | Path | Action |
|---|---|---|
| GET | /users | index |
| GET | /users/new | new |
| POST | /users | create |
| GET | /users/:id | show |
| GET | /users/:id/edit | edit |
| PUT | /users/:id | update |
| DELETE | /users/:id | delete |
Namespaces
Group routes under a common prefix, like /admin:
namespace("admin", -> {
get("/dashboard", "admin#dashboard");
get("/users", "admin#users");
post("/users", "admin#create_user");
});
Scoped Middleware
Apply middleware only to specific route blocks:
// Only /admin/* routes require authentication
middleware("authenticate", -> {
get("/admin", "admin#index");
get("/admin/users", "admin#users");
});
// Public routes - no auth needed
get("/", "home#index");
get("/about", "home#about");
Nested Resources
namespace("api", -> {
resources("users", -> {
resources("posts", -> {
resources("comments", null);
});
});
});
// Creates: /api/users/:user_id/posts/:post_id/comments/:id
Auto-Derived Routes
Soli can automatically map routes to controllers based on naming conventions.
Defining a method named index in home_controller.soli automatically handles GET /home.