ESC
Type to search...
S
Soli Docs

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/usersindex
GET/users/newnew
POST/userscreate
GET/users/:idshow
GET/users/:id/editedit
PUT/users/:idupdate
DELETE/users/:iddelete

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.

Next Steps