🔁 Loader & Action
Remix と同じ HTTP サイクル。GET は loader、POST は action、成功後は自動 revalidate。
Crown は独自のクライアント状態管理を増やしません。loader(GET)と action(POST)を Web 標準の HTTP に 1:1 で対応させます。
loader(GET)
画面の初期表示に必要なデータをサーバーでまとめます。page(req, data) の第 2 引数に流れます。
proc loader*(req: Request): seq[Product] =
let q = req.search(ProductsQuery)
getProducts(q.page, q.sort)
proc page*(req: Request, data: seq[Product]): string =
render(data)
action(POST)と自動 Revalidate
proc action* は同じパスの POST になります。戻り値が空 / revalidate() / void のとき、Crown は同じルートの loader と page を再実行して最新 HTML を返します。リダイレクトや明示的な HTML 断片を返せば、revalidate は走りません。
proc action*(req: Request) =
db.insert(req.form(AddProduct))
# 成功後に loader → page が自動実行される
crown-post に crown-target が無いフォームは、返ってきたフル HTML ドキュメントでページ全体を差し替えます。