Skip to content

Latest commit

 

History

History
196 lines (157 loc) · 5.88 KB

controller.md

File metadata and controls

196 lines (157 loc) · 5.88 KB

コントローラー

戻る

目次

イントロダクション

コントローラーは、ウェブ特有の責任を解決し、ビジネスロジックを呼び出す層です。

コントローラーの作成

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

Urlパラメータ

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ファイルのパスを設定すると、コントローラは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"))

JSONを返す

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)