如何切换更新模型布尔属性?
How to toggle update model bool attribute?
如何在更新操作中切换 active
bool 属性?我习惯了Rails,凤凰有什么好的做法?
示例代码:
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 with your new active state and then call 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.update
或 Repo.insert
时的模式匹配被认为是您想要执行的操作的最佳实践。
通常您会使用在函数中具有模式匹配的参数来调用更新:
def update(conn, %{"id" => id, "task" => task_params}) do
changeset = Task.changeset(task, task_params)
case ...
end
在您的模型上定义的 changeset/2
函数将确保只能修改指定的字段。如果这些与更新时的字段不同,请考虑制作一个 update_changeset/2
函数。这个函数没有什么特别的,你可以定义和使用任意多的函数return一个变更集。
如何在更新操作中切换 active
bool 属性?我习惯了Rails,凤凰有什么好的做法?
示例代码:
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 with your new active state and then call 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.update
或 Repo.insert
时的模式匹配被认为是您想要执行的操作的最佳实践。
通常您会使用在函数中具有模式匹配的参数来调用更新:
def update(conn, %{"id" => id, "task" => task_params}) do
changeset = Task.changeset(task, task_params)
case ...
end
在您的模型上定义的 changeset/2
函数将确保只能修改指定的字段。如果这些与更新时的字段不同,请考虑制作一个 update_changeset/2
函数。这个函数没有什么特别的,你可以定义和使用任意多的函数return一个变更集。