目次
コントローラーは、ウェブ特有の責任を解決し、ビジネスロジックを呼び出す層です。
ducere
コマンドを使います。
ducere make controller
リソースコントローラは、基本的なCRUD/リソーススタイルのメソッドを持つコントローラです。
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")
各メソッドは、以下のリストに従って呼び出す必要があります。
HTTP method | URL path | controller method | usecase |
---|---|---|---|
GET | /posts | index | すべての記事を表示する |
GET | /posts/create | create | 新規投稿ページの表示 |
POST | /posts | store | 新規投稿 |
GET | /posts/{id} | show | 1つの記事を表示する |
GET | /posts/{id}/edit | edit | 1つの記事編集ページを表示 |
POST | /posts/{id} | update | 1つの記事を更新 |
DELETE | /posts/{id} | destroy | 1つの記事を削除する |
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")
render
関数で文字列を設定した場合、コントローラは文字列を返します。
return render("index")
html
関数にhtmlファイルのパスを設定すると、コントローラはHTMLを返します。
このファイルパスは app/http/views
ディレクトリからの相対パスでなければなりません。
return render(html("pages/sample/index.html"))
# or
return render(await asyncHtml("pages/sample/index.html"))
>> display app/http/views/pages/sample/index.html
render
関数で引数を指定してテンプレートの実装関数を呼び出すと、テンプレートが返されます。
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"))
render
関数でJsonNodeを設定すると、コントローラはJSONを返します。
return render(%*{"key": "value"})
第一引数にステータスを、第二引数にレスポンスボディを入れてください。
return render(Http500, "This is a response body")
使用可能なレスポンスステータス一覧。
レスポンスステータスの説明。
render
関数の最後の引数にヘッダーを入れてください。
var header = newHttpHeaders()
header.add("key1", "value1")
header.add("key2", ["value1", "value2"])
return render("setHeader", header)
次のようにJSONレスポンスやステータス付きの場合もheaderを置くことが出来ます。
return render(%*{"key": "value"}, header)
return render(Http400, "setHeader", header)
return render(Http400, %*{"key": "value"}, header)
redirect
関数を使います.
return redirect("https://nim-lang.org")
return redirect("https://nim-lang.org", header)
return errorRedirect("/login")
return errorRedirect("/login", header)