如何在更新操作中切换 active bool 属性?我习惯了 Rails,在 Phoenix 有什么好的做法?

示例代码:

defmodule Todo.task do
  use Todo.Web, :model

  schema "task" do
    field :active, :boolean, default: false

    timestamps
  end

  @required_fields ~w(active)
  @optional_fields ~w()

  def changeset(model, params \\ :empty) do
    model
    |> cast(params, @required_fields, @optional_fields)
  end
end

defmodule Todo.TaskController do
  use Todo.Web, :controller
  alias Todo.Task

  def update(conn, %{"id" => id}) do
    task = Repo.get_by(Task, id: id)
    # task.active = !task.active
    # task.save
    render(conn, "show.json", task: task)
  end
end

最佳答案

您可以将 Ecto.Changeset 与新的事件状态一起使用,然后调用 Repo.update/2

  def update(conn, %{"id" => id}) do
    task = Repo.get_by(Task, id: id)
    changeset = Task.changeset(task,%{active: !task.active})
    case Repo.update(changeset) do
      {:ok, task}         -> redirect(conn, to: task_path(conn, :show, task))
      {:error, changeset} -> render(conn, "edit.html", changeset: changeset)
    end
  end

调用 Repo.updateRepo.insert 时的模式匹配是您想要执行的操作的最佳实践。

通常,您会使用在函数中匹配模式的参数调用 update:
  def update(conn, %{"id" => id, "task" => task_params}) do
    changeset = Task.changeset(task, task_params)
    case ...
  end

模型上定义的 changeset/2 函数将确保只能修改指定的字段。如果这些与更新时的字段不同,请考虑制作 update_changeset/2 函数。这个函数没有什么特别之处,你可以定义和使用尽可能多的函数来返回一个变更集。

关于elixir - 如何切换更新模型 bool 属性?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33632851/

10-12 17:09
查看更多