Current section

Files

Jump to
formex lib formex controller.ex
Raw

lib/formex/controller.ex

defmodule Formex.Controller do
alias Formex.Form
alias Formex.Builder
defmacro __using__(_) do
quote do
import Formex.Builder
import Formex.Controller
end
end
@moduledoc """
Helpers for controller. Imports `Formex.Builder`. Probably you are looking for
`Formex.Builder.create_form/5`.
# Installation:
`web/web.ex`
```
def controller do
quote do
use Formex.Controller
end
end
```
# Usage
```
def new(conn, _params) do
form = create_form(App.ArticleType, %Article{})
render(conn, "form.html", form: form)
end
```
```
def create(conn, %{"article" => article_params}) do
App.ArticleType
|> create_form(%Article{}, article_params)
|> handle_form
|> case do
{:ok, article} ->
# do something with a new article struct
{:error, form} ->
# display errors
render(conn, "form.html", form: form)
end
end
```
For usage with Ecto see `Formex.Ecto.Controller`
"""
@doc """
Validates form. When is valid, returns `{:ok, form.new_struct}`, otherwise, `{:error, form}` with
validation errors inside `form.errors`
"""
@spec handle_form(Form.t) :: {:ok, Map.t} | {:error, Form.t}
def handle_form(form) do
form = Builder.handle_submit(form)
if form.valid? do
{:ok, form.new_struct}
else
{:error, %{form | submitted?: true}}
end
end
end