Ecto - 自动大写字段
Ecto - automatically capitalizing fields
我有一个名为 Company
的外模型,它有一个 name
字段。我想要的是在数据库中插入或更新公司之前将 String.capitalize
应用于 name 属性。这些是CompanyController
的create
和update
函数:
def create(conn, %{"company" => company_params}) do
case Company.insert(conn.assigns.current_user, company_params) do
{:ok, _company} ->
redirect(conn, to: company_path(conn, :index))
{:error, changeset} ->
render(conn, "new.html", changeset: changeset)
end
end
def update(conn, %{"id" => company_id, "company" => company_params}) do
company = Company.get(company_id)
case Company.update(company, company_params) do
{:ok, _company} ->
redirect(conn, to: company_path(conn, :show, company))
{:error, changeset} ->
render(conn, "edit.html", company: company, changeset: changeset)
end
end
可以简单地通过使用 Map.update! 函数来完成,或者在控制器的单独函数中:
def create(conn, %{"company" => company_params}) do
case Company.insert(conn.assigns.current_user, with_capitalized_name(company_params)) do
{:ok, _company} ->
redirect(conn, to: company_path(conn, :index))
{:error, changeset} ->
render(conn, "new.html", changeset: changeset)
end
end
def update(conn, %{"id" => company_id, "company" => company_params}) do
company = Company.get(company_id)
case Company.update(company, with_capitalized_name(company_params)) do
{:ok, _company} ->
redirect(conn, to: company_path(conn, :show, company))
{:error, changeset} ->
render(conn, "edit.html", company: company, changeset: changeset)
end
end
def with_capitalized_name(company_params)
Map.update!(company_params, "name", &String.capitalize/1)
end
或者在用于转换和验证参数的函数中(通常称为 changeset
):
def changeset(company, attrs) do
company
|> cast(attrs, [:name])
|> capitalize(attrs, :name)
end
defp capitalize(_, attrs, field) do
Map.update!(attrs, field, &String.capitalize/1)
end
我有一个名为 Company
的外模型,它有一个 name
字段。我想要的是在数据库中插入或更新公司之前将 String.capitalize
应用于 name 属性。这些是CompanyController
的create
和update
函数:
def create(conn, %{"company" => company_params}) do
case Company.insert(conn.assigns.current_user, company_params) do
{:ok, _company} ->
redirect(conn, to: company_path(conn, :index))
{:error, changeset} ->
render(conn, "new.html", changeset: changeset)
end
end
def update(conn, %{"id" => company_id, "company" => company_params}) do
company = Company.get(company_id)
case Company.update(company, company_params) do
{:ok, _company} ->
redirect(conn, to: company_path(conn, :show, company))
{:error, changeset} ->
render(conn, "edit.html", company: company, changeset: changeset)
end
end
可以简单地通过使用 Map.update! 函数来完成,或者在控制器的单独函数中:
def create(conn, %{"company" => company_params}) do
case Company.insert(conn.assigns.current_user, with_capitalized_name(company_params)) do
{:ok, _company} ->
redirect(conn, to: company_path(conn, :index))
{:error, changeset} ->
render(conn, "new.html", changeset: changeset)
end
end
def update(conn, %{"id" => company_id, "company" => company_params}) do
company = Company.get(company_id)
case Company.update(company, with_capitalized_name(company_params)) do
{:ok, _company} ->
redirect(conn, to: company_path(conn, :show, company))
{:error, changeset} ->
render(conn, "edit.html", company: company, changeset: changeset)
end
end
def with_capitalized_name(company_params)
Map.update!(company_params, "name", &String.capitalize/1)
end
或者在用于转换和验证参数的函数中(通常称为 changeset
):
def changeset(company, attrs) do
company
|> cast(attrs, [:name])
|> capitalize(attrs, :name)
end
defp capitalize(_, attrs, field) do
Map.update!(attrs, field, &String.capitalize/1)
end