benonymus
Elixir arc delete file error
Hey I am trying to delete files when the entity from the database is getting deleted following the example from the github page:
{:ok, path} = ChallengeGroupAvatar.store({challenge_group.avatar, user})
:ok = ChallengeGroupAvatar.delete({path, user})
but on the first line form these 2 I am getting this error:
no function clause matching in Arc.File.new/1
Why is that the case?
I even tried to do it with no scope, but the same error happens
Most Liked
sneako
Arc.File.new/1 doesnt have any documentation, but if you look at the source here: arc/lib/arc/file.ex at master · stavro/arc · GitHub
Arc.File.new/1 accepts a binary, a map that looks like %{filename: filename, binary: binary} or a map that looks like %{filename: filename, path: path}, none of which match your input %{file_name: “PICTURETEST.png”, updated_at: ~N[2018-10-24 16:15:58]}
Eiji
Your challenge_group.avatar or changed value in UserTeam1Web.Controllers.ChallengeGroupController.delete/2 (I don’t know your code) as in stacktrace contains map with file_name and updated_at keys. Both Arc.Actions.Store.store/2 and Arc.Actions.Url.url/2 requires to have valid parameter for Arc.File.new/1 which are one of:
- Remote url - i.e. binary which starts with
http - Local url - i.e. any other binary like
/path/to/file.extensionor relational file path like:./path/to/file.extension - Map which contains both of two keys:
binaryandfilename - Map which contains both of two keys:
filenameandpath
This means that if you pass map or struct with:
- only one of those keys:
binary,filenameandpaththen it will fail - all of those keys:
binary,filenameandpaththenpathkey would be ignored
I don’t know your code and structs, so I can’t say what you can pass, because from this part of error:
(arc) lib/arc/file.ex:16: Arc.File.new(%{file_name: “PICTURETEST.png”, updated_at: ~N[2018-10-24 16:15:58]})
I can see that you are passing only file_name and updated_at, so what you need to do is:
-
Use
file_nameand pass it in remote url
like:http://my.domain/path/to/#{challenge_group.avatar.file_name} -
Use
file_nameand pass it in local url
like:/path/to/#{challenge_group.avatar.file_nam}
or:./path/to/#{challenge_group.avatar.file_name} -
Use
File.read/1orFile.read!/1to get content of file and pass it inbinarykey, remove not neededupdated_atkey and change keyfile_nametofilename -
Get path to file you are trying to reference with
file_name, remove not neededupdated_atkey and change keyfile_nametofilename








