Getting nil in Arc scope

Hello,

Please i have successfully used Arc and Arc_ecto in previous versions of Phoenix framework without any issue.

However after upgrading to Phoenix 1.3.0, Arc ecto stopped working. I get a nil user on the storage_dir method.

Arc 0.8.0
Arc_ecto 0.7.0
Phoenix 1.3.0

Edited:

defmodule ProductDispatchWeb.Uploaders.Avatar do
  use Arc.Definition
  use Arc.Ecto.Definition

  @extension_whitelist ~w(.jpg .jpeg .gif .png)

  @acl :public_read

  # Include ecto support (requires package arc_ecto installed):
  # use Arc.Ecto.Definition
  # @versions [:original]

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

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

  # Override the persisted filenames:
  def filename(version, {file, _}) do
    "#{version}_#{String.replace(file.file_name, ~r/\..../, "")}"
  end

  def filename(version, _) do
    version
  end

  def __storage, do: Arc.Storage.Local

  # Override the storage directory:
  def storage_dir(_, {_, user}) do
    "uploads/users/avatars/#{user.id}"
  end

  #Provide a default URL if there hasn't been a file uploaded
  def default_url(_, _) do
      ProductDispatchWeb.Endpoint.url <> "/img/default.png"
  end

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

  # Specify custom headers for s3 objects
  # Available options are [:cache_control, :content_disposition,
  #    :content_encoding, :content_length, :content_type,
  #    :expect, :expires, :storage_class, :website_redirect_location]
  #
  # def s3_object_headers(version, {file, scope}) do
  #   [content_type: Plug.MIME.path(file.file_name)]
  # end

  def validate({file, _}) do
    file_extension = file.file_name |> Path.extname |> String.downcase
    Enum.member?(@extension_whitelist, file_extension)
  end
end

My Schema looks like this

defmodule ProductDispatch.Accounts.User do
  use Ecto.Schema
  use Arc.Ecto.Schema
  
  import Ecto.Changeset
  alias ProductDispatch.Accounts.User

  @primary_key {:id, :binary_id, autogenerate: true}
  @foreign_key_type :binary_id

  schema "users" do
    field :avatar, ProductDispatchWeb.Uploaders.Avatar.Type
    field :email, :string
    field :firstname, :string
    field :lastname, :string

    timestamps()
  end

  @doc false
  def changeset(%User{} = user, attrs) do
    user
    |> cast(attrs, [:firstname, :lastname, :email, :cpassword, :mobile_number, :active, :password_reset_token, :confirmation_token, :ip_address, :avatar,
                    :banned, :is_admin, :admin_level, :platform, :browser, :last_login])
    |> cast_attachments(attrs, [:avatar])
    |> validate_required([:firstname, :lastname, :email], message: "Is required")
    |> unique_constraint(:email, message: "Email already taken")
  end


end

Please how can i resolve this?

1 Like

I later found the issue. It was an error on my path.

I added :avatar to the cast method.

1 Like