Ecto - 自动大写字段

Ecto - automatically capitalizing fields

我有一个名为 Company 的外模型,它有一个 name 字段。我想要的是在数据库中插入或更新公司之前将 String.capitalize 应用于 name 属性。这些是CompanyControllercreateupdate函数:

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