Giter Club home page Giter Club logo

Comments (10)

MartinElvar avatar MartinElvar commented on July 25, 2024 8

Thank you @stavro, i think that is a reasonable solution.

Maybe we should add this example to the documentation, i can imagine other could run into the same wall, specially if you are comming from carrierwave in Rails 😃

from arc_ecto.

Bounga avatar Bounga commented on July 25, 2024 6

What if Article.avatar_changeset(article, article_params) |> Repo.update fails? There's no transaction and no rollback.

from arc_ecto.

suprnova32 avatar suprnova32 commented on July 25, 2024 5

This information should definitely be in the documentation. I just spent a couple of hours scratching my head and looking for a solution. I don't mind that it doesn't work like Paperclip, but this use case is the most common, specially if you want to reuse a generic Upload schema for e.g. User, Photo, etc. In that case, the scope will not exist before the file is uploaded.

I just realized that you could scope the file to an existing field of the struct, but in any case, this should be documented.

from arc_ecto.

vantran avatar vantran commented on July 25, 2024 4

@Bounga maybe try something like this

Repo.transaction(fn ->
  with {:ok, product} <- Product.changeset(%Product{}, params) |> Repo.insert,
       {:ok, product_with_photo} <- Product.photo_changeset(product, params) |> Repo.update
  do
    {:ok, product_with_photo}
  else
    {:error, changeset} ->
      Repo.rollback(changeset)
      {:error, changeset}
  end
end)

That said, it would be so nice if it works like Paperclip allowing you to add the attachment at the same time as creating new object.

from arc_ecto.

stavro avatar stavro commented on July 25, 2024 3

Using option (2) above (waiting until after the model is saved), you could:

#
# Model
#
def creation_changeset(params) do
  %Article{} |> cast(params, ~w(name), ~w())
end

def avatar_changeset(article, params) do
  article |> cast_attachments(params, ~w(avatar), ~w())
end

#
# Controller
#
def create(conn, %{"article" => article_params}) do
  # Add author.
  article_params = Dict.put_new(article_params, "admin_id", Plug.Conn.get_session(conn, :current_user))
  changeset = Article.creation_changeset(%Article{}, article_params)

  case Repo.insert(changeset) do
    {:ok, article} ->
      article = Article.avatar_changeset(article, article_params) |> Repo.update

      conn
      |> put_flash(:info, "Article created successfully.")
      |> redirect(to: admin_article_path(conn, :index))
    {:error, changeset} ->
      render(conn, "new.html", changeset: changeset)
  end
end

If you need it all saved with one call to the database then cannot use the id in the storage directory.

from arc_ecto.

KingKongDan avatar KingKongDan commented on July 25, 2024

I had the same problem. Thanks for addressing this issue.

from arc_ecto.

stavro avatar stavro commented on July 25, 2024

If you need to upload a file before the model is saved, then you cannot use the id of that model.

You should either generate a UUID for the file name or wait until after the model is saved.

Can you explain a little more about the workflow and model? There's probably a better structure to the files that we can come up with.

from arc_ecto.

MartinElvar avatar MartinElvar commented on July 25, 2024

Hallo @stavro,

It's a new/create action in Phoenix, almost standard code generated by Phoenix. Basically i enter my form, and select images to my form.

How would i wait for the model to be saved, isn't the image saved as a part of cast_attachments? So i would have to manually call store?

from arc_ecto.

tispratik avatar tispratik commented on July 25, 2024

Thanks for the solution. This works!

from arc_ecto.

gitviola avatar gitviola commented on July 25, 2024

Thanks!!!!

from arc_ecto.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.