更改变更集

时间:2017-03-18 15:59:44

标签: phoenix-framework ecto

我不明白如何更改给定变更集的值。

设置

mix phoenix.new shop
cd shop
mix ecto.create
mix phoenix.gen.html Product products name price:integer
mix ecto.migrate

网络/ router.ex

[...]
scope "/", Shop do
  pipe_through :browser # Use the default browser stack

  get "/", PageController, :index
  resources "/products", ProductController
end
[...]

问题

我启动IEX并创建一个新的变更集:

iex -S mix phoenix.server
iex(1)> alias Shop.Product
iex(2)> changeset = Product.changeset(%Product{price: 1})
#Ecto.Changeset<action: nil, changes: %{},
 errors: [name: {"can't be blank", [validation: :required]}],
 data: #Shop.Product<>, valid?: false>

我现在如何更改给定的变更集?以下代码不起作用:

iex(3)> changeset = Product.changeset(changeset, %{name: "Orange"})
#Ecto.Changeset<action: nil, changes: %{name: "Orange"},
 errors: [name: {"can't be blank", [validation: :required]}],
 data: #Shop.Product<>, valid?: false>

由于错误,我现在无法Shop.Repo.insert(changeset)

我知道在这个具体示例中,我可以更改iex(2)行以获取我想要的变更集。但是我想知道在创建变更集后如何操作变更集。

1 个答案:

答案 0 :(得分:1)

Product.changeset(changeset.data, Map.merge(changeset.changes, %{name: "Orange"}))可以解决问题。感谢Dogbert

$ iex -S mix phoenix.server
iex(1)> alias Shop.Product
Shop.Product
iex(2)> changeset = Product.changeset(%Product{price: 1})
#Ecto.Changeset<action: nil, changes: %{},
 errors: [name: {"can't be blank", [validation: :required]}],
 data: #Shop.Product<>, valid?: false>
iex(3)> changeset = Product.changeset(changeset.data, Map.merge(changeset.changes, %{name: "Orange"}))
#Ecto.Changeset<action: nil, changes: %{name: "Orange"}, errors: [],
 data: #Shop.Product<>, valid?: true>
iex(4)>