gpt4 book ai didi

elixir - Ecto:将 %Plug.Upload 转换到虚拟字段以进行文件上传验证

转载 作者:行者123 更新时间:2023-12-03 15:51:19 26 4
gpt4 key购买 nike

我希望仅当变更集有效并包含文件时才能够触发文件上传。

投一个%Plug.Upload 有可能/一个好主意吗?例如

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

defp save_image(changeset) do
case changeset do
%Ecto.Changeset{valid?: true, changes: %{image: image}} ->
%{ "url" => "http://" <> image_url } = Cloudinary.upload(image)
put_change(changeset, :image_url, image_url)
_ ->
changeset
end
end

我试图设置 :image到类型为 :map 的虚拟字段但它不会转换` %Plug.Upload
schema "model" do
field :image_url, :string
field :image, :map, virtual: true
timestamps
end

这只会导致验证错误消息 Image is invalid

最佳答案

为什么不定义以下函数(在单独的模块中):

def save_image(model, params) do
changeset = Model.changeset(model, params)
case changeset.valid? do
true ->
%{ "url" => "http://" <> image_url } = Cloudinary.upload(params["file"])
Model.image_changeset(changeset, image)
_ -> changeset
end
end

并在您的模型中为图像变更集提供单独的功能。
def image_changeset(changeset, image_url) do
put_change(changeset, :image_url, image_url)
end

关于elixir - Ecto:将 %Plug.Upload 转换到虚拟字段以进行文件上传验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33749774/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com