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?