簡體   English   中英

Ecto:將%Plug.Upload轉換為虛擬字段以進行文件上載驗證

[英]Ecto: Casting %Plug.Upload to virtual field for file upload validations

我希望只有在變更集有效且包含文件時才能觸發文件上傳。

是否有可能/一個好主意施放%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

這將只是找到將虛擬字段的類型設置為:any

schema "model" do
  field :image_url, :string
  field :image, :any, virtual: true
  timestamps
end

現在,當所有必填字段都存在且有文件時,它會將其上傳到雲端,否則它只會正常創建/更新字段,如果沒有選擇圖像文件則不會觸發上傳

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM