Table of Contents
Controller is the layer that resolves web-specific responsibilities and invokes business logic.
Use ducere
command
ducere make controller
Resource controllers are controllers that have basic CRUD / resource style methods to them.
from json
# framework
import basolato/controller
proc index*(request:Request, params:Params):Future[Response] {.async.} =
return render("index")
proc show*(request:Request, params:Params):Future[Response] {.async.} =
let id = params.urlParams["id"].getInt
return render("show")
proc create*(request:Request, params:Params):Future[Response] {.async.} =
return render("create")
proc store*(request:Request, params:Params):Future[Response] {.async.} =
return render("store")
proc edit*(request:Request, params:Params):Future[Response] {.async.} =
let id = params.urlParams["id"].getInt
return render("edit")
proc update*(request:Request, params:Params):Future[Response] {.async.} =
let id = params.urlParams["id"].getInt
return render("update")
proc destroy*(request:Request, params:Params):Future[Response] {.async.} =
let id = params.urlParams["id"].getInt
return render("destroy")
Each method should be called according to the following list
HTTP method | URL path | controller method | usecase |
---|---|---|---|
GET | /posts | index | Display all posts |
GET | /posts/create | create | Display new post page |
POST | /posts | store | Submit new post |
GET | /posts/{id} | show | Display one post |
GET | /posts/{id}/edit | edit | Display one post edit page |
POST | /posts/{id} | update | Update one post |
DELETE | /posts/{id} | destroy | Delete one post |
view
<input type="text" name="email">
controller
proc index*(request:Request, params:Params):Future[Response] {.async.} =
let email = params.getStr("email")
routing
var routes = Routes.new()
routes.get("/{id:int}", some_controller.show)
controller
proc show*(request:Request, params:Params):Future[Response] {.async.} =
let id = params.getInt("id")
URL
/updates?queries=500
controller
proc update*(request:Request, params:Params):Future[Response] {.async.} =
let queries = params.getInt("queries")
If you set string in render
proc, controller returns string.
return render("index")
If you set html file path in html
proc, controller returns HTML.
This file path should be relative path from app/http/views
dir
return render(html("pages/sample/index.html"))
# or
return render(await asyncHtml("pages/sample/index.html"))
>> display app/http/views/pages/sample/index.html
Call template proc with args in render
will return template
app/http/views/pages/sample/index_view.nim
import basolato/view
proc indexView(name:string):string = tmpli html"""
<h1>index</h1>
<p>$name</p>
"""
main.nim
return render(indexView("John"))
If you set JsonNode in render
proc, controller returns JSON.
return render(%*{"key": "value"})
Put response status code arge1 and response body arge2
return render(Http500, "This is a response body")
Here is the list of response status code available.
Here is a experiment of HTTP status code
Put header at the end of render
var header = newHeaders()
header.set("key1", "value1")
header.set("key2", ["value1", "value2"])
return render("setHeader", header)
render
proc are also followings available.
return render(%*{"key": "value"}, header)
return render(Http400, "setHeader", header)
return render(Http400, %*{"key": "value"}, header)
You can use redirect
proc.
return redirect("https://nim-lang.org")
return redirect("https://nim-lang.org", header)
return errorRedirect("/login")
return errorRedirect("/login", header)