Skip to content

Latest commit

 

History

History
197 lines (157 loc) · 4.86 KB

controller.md

File metadata and controls

197 lines (157 loc) · 4.86 KB

Controller

back

Table of Contents

Introduction

Controller is the layer that resolves web-specific responsibilities and invokes business logic.

Creating a Controller

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

How to get params

Request params

view

<input type="text" name="email">

controller

proc index*(request:Request, params:Params):Future[Response] {.async.} =
  let email = params.getStr("email")

Url params

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")

Query params

URL

/updates?queries=500

controller

proc update*(request:Request, params:Params):Future[Response] {.async.} =
  let queries = params.getInt("queries")

Response

Returning string

If you set string in render proc, controller returns string.

return render("index")

Returning HTML file

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

Returning template

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 = tmpl"""
<h1>index</h1>
<p>$name</p>
"""

main.nim

return render(indexView("John"))

Returning JSON

If you set JsonNode in render proc, controller returns JSON.

return render(%*{"key": "value"})

Response with status

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

Response with header

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)

Redirect

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)