我不明白如何更改给定变更集的值。
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)行以获取我想要的变更集。但是我想知道在创建变更集后如何操作变更集。
答案 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)>