Comments (10)
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.
What if Article.avatar_changeset(article, article_params) |> Repo.update
fails? There's no transaction and no rollback.
from arc_ecto.
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.
@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.
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.
I had the same problem. Thanks for addressing this issue.
from arc_ecto.
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.
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.
Thanks for the solution. This works!
from arc_ecto.
Thanks!!!!
from arc_ecto.
Related Issues (20)
- 2 pictures in one schema HOT 1
- Ecto 3.0 emits warnings when using arc_ecto HOT 3
- arc_ecto not working with ecto 3 HOT 15
- Examples for saving arc photo from websocket? HOT 1
- Dialyzer error HOT 1
- Problem with Tests
- Support for signed Cloudfront web distributions.
- Specify Field Name In Scope
- Truncating updated_at broke my tests
- Cant get upload from frontend to work with Ecto 3 and arc_ecto in Phoenix API. HOT 1
- Uploading to S3 from a remote URL returns a SignatureDoesNotMatch error
- Fix Ecto 3.2 warnings HOT 3
- Adding or changing versions HOT 3
- Timout when transforming image HOT 1
- Upload via remote URL doesn't seem to work. HOT 1
- allow_urls feature to allow upload for valid URLs only HOT 1
- arc_ecto requires arc 0.8.0 HOT 1
- Error uploading to S3 with 0.10.0 HOT 2
- Microseconds in updated_at timestamp HOT 4
- Todo: Support Ecto 3 HOT 5
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from arc_ecto.