Packages
formex
0.3.0
0.6.7
0.6.6
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.10
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.16
0.4.15
0.4.14
0.4.13
0.4.12
0.4.11
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.3
0.3.2
0.3.1
0.3.0
0.2.3
0.2.2
0.2.1
0.2.0
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
Form library for Phoenix with Ecto support
Current section
Files
Jump to
Current section
Files
lib/formex/builder.ex
defmodule Formex.Builder do
import Ecto.Changeset
alias Formex.Form
@moduledoc """
The form builder to be used in a controller. Imported by `Formex.Controller`.
Example:
```
form = create_form(App.ArticleType, %Article{})
render(conn, "new.html", form: form)
```
"""
@doc """
Creates a form struct.
## Arguments
* `type` - the module that implements `Formex.Type` behaviour, for example: `App.ArticleType`
* `struct` - the struct that will be used in `Ecto.Changeset.cast/3`, for example: `%App.Article{}`
* `params` - the parameters that will be used in `Ecto.Changeset.cast/3`
"""
@spec create_form(module, Ecto.Schema.t, Map.t) :: Form.t
def create_form(type, struct, params \\ %{}) do
%Form{
type: type,
struct: struct,
model: struct.__struct__,
params: params
}
|> type.build_form()
|> create_changeset(type)
# |> IO.inspect
end
#
defp create_changeset(form, type) do
changeset = form.struct
|> cast(form.params, get_normal_fields_names(form))
|> validate_required(get_required_fields_names(form))
|> type.changeset_after_create_callback
form
|> Map.put(:changeset, changeset)
end
defp get_normal_fields_names(form) do
form.fields
# |> Enum.filter(&(!&1.assoc))
|> Enum.map(&(&1.name))
end
# defp get_assoc_fields_names(form) do
# form.fields
# |> Enum.filter(&(&1.assoc))
# |> Enum.map(&(&1.name))
# end
defp get_required_fields_names(form) do
form.fields
|> Enum.filter(&(&1.required))
|> Enum.map(&(&1.name))
end
end