stavro/arc_ecto

Issues with atoms.

MartinElvar opened this issue · 8 comments

When i try to print the url for my model using the url function like this.

<%= Mobil.Logo.url({company.logo, company}, :thumb) %>

I get the following error

** (exit) an exception was raised:
    ** (FunctionClauseError) no function clause matching in IO.chardata_to_string/1
        (elixir) lib/io.ex:330: IO.chardata_to_string(:thumb)
        (elixir) lib/path.ex:474: Path.do_join/3
        (elixir) lib/path.ex:469: Path.join/2
        (mobil) web/uploaders/logo.ex:3: Mobil.Logo.url/3
        (mobil) web/templates/admin/company/index.html.eex:24: anonymous fn/3 in Mobil.Admin.CompanyView.index.html/1
        (elixir) lib/enum.ex:1261: Enum."-reduce/3-lists^foldl/2-0-"/3
        (mobil) web/templates/admin/company/index.html.eex:22: Mobil.Admin.CompanyView."index.html"/1
        (phoenix) lib/phoenix/view.ex:197: Phoenix.View.render_within/3

But if instead uses a string, like this

<%= Mobil.Logo.url({company.logo, company}, "thumb") %>

Then there is no problems.

This is also a problem when uploading images, where i had add to cast the file name to a string, as i got the somewhat same error without it.

lib/arc/actions/storage/local.ex, line: 9

{:ok, _} = File.copy(file.path, Path.join(destination_dir, file_name |> Atom.to_string))

This could be a Arc issue, however i'm using it with the arc_ecto module :-)

My stack

%{"arc": {:hex, :arc, "0.1.1"},
  "arc_ecto": {:hex, :arc_ecto, "0.1.2"},
  "comeonin": {:hex, :comeonin, "1.1.2"},
  "cowboy": {:hex, :cowboy, "1.0.2"},
  "cowlib": {:hex, :cowlib, "1.0.1"},
  "decimal": {:hex, :decimal, "1.1.0"},
  "ecto": {:hex, :ecto, "1.0.2"},
  "erlcloud": {:hex, :erlcloud, "0.9.2"},
  "fs": {:hex, :fs, "0.9.2"},
  "jsx": {:hex, :jsx, "2.1.1"},
  "lhttpc": {:hex, :lhttpc, "1.3.0"},
  "meck": {:hex, :meck, "0.8.3"},
  "phoenix": {:hex, :phoenix, "1.0.2"},
  "phoenix_ecto": {:hex, :phoenix_ecto, "1.2.0"},
  "phoenix_html": {:hex, :phoenix_html, "2.2.0"},
  "phoenix_live_reload": {:hex, :phoenix_live_reload, "1.0.0"},
  "plug": {:hex, :plug, "1.0.0"},
  "poison": {:hex, :poison, "1.5.0"},
  "poolboy": {:hex, :poolboy, "1.5.1"},
  "postgrex": {:hex, :postgrex, "0.9.1"},
  "ranch": {:hex, :ranch, "1.1.0"}}

Would love to help, but my macro skills are not present yet :/

Can you show me the contents of your uploader definition (web/uploaders/logo.ex) please?

Hi Stavro,

Thank you for your quick response, here is my uploader.

defmodule Mobil.Logo do
  use Arc.Definition
  use Arc.Ecto.Definition

  # To add a thumbnail version:
  @versions [:original, :thumb]

  # Whitelist file extensions:
  def validate({file, _}) do
   ~w(.jpg .jpeg .gif .png) |> Enum.member?(Path.extname(file.file_name))
  end

  # Define a thumbnail transformation:
  def transform(:thumb, _) do
    {:convert, "-strip -thumbnail 250x250^ -gravity center -extent 250x250 -format png"}
  end

  def __storage, do: Arc.Storage.Local

  # Override the persisted filenames:
  def filename(version, _) do
    version
  end

  # Override the storage directory:
  def storage_dir(version, {file, scope}) do
    "uploads/company/logo/#{scope.id}"
  end

  # Provide a default URL if there hasn't been a file uploaded
  # def default_url(version) do
  #   "/images/avatars/default_#{version}.png"
  # end
end

Thank you - I do believe this is a bug in arc and will look into it shortly

@MartinElvar Can you upgrade arc (not arc_ecto) to v0.1.2 and try again?

@stavro That seemed to do the trick, thx for the quick support :-)

@MartinElvar Of course! Can you please do me a favor and explain to me a little bit about your workflow with local filestorage?

  • Where are you hosting
  • How you are using the local paths after storing the attachment logo
  • What application server (Phoenix, Plug, cowboy, etc)

I'm trying to understand the audience a little more so I can add the right features.

Thanks!

@stavro I would love to help out :-). Let me get back to you tomorrow, it's getting kind of late, here at the other site of the planet 👻!

Hallo @stavro,

As promised a summary of my setup, however keep in mind, that my project is not yet complete; i also discovered some things which makes arc_ecto a bit of a challenge to implement with phoenix, however i will create some dedicated issues for those as i go a long. (These are not necessarily bugs, but things that could improve the experience).

"Where are you hosting"

  • The plan is to host all images locally, on a virtual machine, on a digitalocean cloud like machine.

"How you are using the local paths after storing the attachment logo"

  • Basically i got a ecto model named "Company", and each company is presented with a logo. I've created a administration panel for my site, where i can upload the logo's for each company.

"What application server (Phoenix, Plug, cowboy, etc)"

  • Yes, Cowboy, Plug, Phoenix, Ecto.

Let me know, if you got any further questions 😃