JackMaarek

JackMaarek

Elixir association help

Hello guys,
Sorry for disturbing you again but I’m facing an issues that I cannot understand on my own.

I’m trying to create a image gallery api that handles images associated with categories and tags,
right now I’m focused on the association between the images and the categories and when I’m trying to send a image with a category id the image enitty is created but not associated with the category:

 phoenix_1  | [info] POST /api/image
phoenix_1  | [debug] Processing with ApiAppWeb.ImageController.create/2
phoenix_1  |   Parameters: %{"image" => %{"category_id" => 1, "description" => "This is a test image", "image" => "mylovelywife.png", "name" => "i1"}}
phoenix_1  |   Pipelines: [:api]
phoenix_1  | [debug] QUERY OK db=2.9ms queue=0.1ms idle=9349.5ms
phoenix_1  | INSERT INTO "image" ("description","image","name","inserted_at","updated_at") VALUES ($1,$2,$3,$4,$5) RETURNING "id" ["This is a test image", "mylovelywife.png", "i1", ~N[2020-04-20 23:37:57], ~N[2020-04-20 23:37:57]]
phoenix_1  | [info] Sent 201 in 7ms

Here is my schema for my categories:

schema "category" do
    field :name, :string
    has_many :image, ApiApp.Images.Image

    timestamps()
  end

  @doc false
  def changeset(categories, attrs) do
    categories
    |> cast(attrs, [:name])
    |> validate_required([:name])
    |> unique_constraint(:name)
    |> validate_length(:name, max: 60, count: :codepoints)
  end

And the schema for the images :

 schema "image" do
    field :description, :string
    field :image, :string
    field :name, :string
    belongs_to :category, ApiApp.Images.Categories, foreign_key: :category_id

    timestamps()
  end

  @doc false
  def changeset(image, attrs) do
    image
    |> cast(attrs, [:name, :description, :image])
    |> validate_required([:name, :description, :image])
    |> foreign_key_constraint(:category_id,
         name: :image_category_id_fkey,
         message: "Category not found!"
       )
  end

Also in my create_image method I’ve putted the changest’s cast_assoc method:

  def create_image(attrs \\ %{}) do
    %Image{}
    |> Image.changeset(attrs)
    |> cast_assoc(:category, with: &Category.changeset/2)
    |> Repo.insert()
  end

If anyone got an idea of what I’m doing wrong It would be great to hear !
Thanks a lot for your time and help guys.

Most Liked

axelson

axelson

Scenic Core Team

I think you might want to change your parameters from:
%{"image" => %{"category_id" => 1, "description" => "This is a test image", "image" => "mylovelywife.png", "name" => "i1"}}
to:
%{"image" => %{"category" => %{"id" => 1}, "description" => "This is a test image", "image" => "mylovelywife.png", "name" => "i1"}}

cast_assoc expects the embed to have nested params.

nickdichev

nickdichev

So, in your controller you have create/2 where you catch the happy path in the with clause. What I think is happening here is that you are actually getting a changeset error that isn’t being handled. The reason I think this is the case is because of the fallback controller function definition error.

You don’t have an else clause for the with so create/2 is just returning the {:error, changeset} of Repo.insert() in create_image/1. But, {:error, changeset} isn’t a valid %Plug.Conn{} struct – the expected return of your controller functions!

Since you’re not returning a %Plug.Conn{}, Phoenix tries to help you out and call your defined fallback controller ApiAppWeb.FallbackController. You are likely missing the function call(conn, {:error, changeset}) there (you might want to pattern match against the changeset against %Ecto.Changeset{} to avoid a catch all match…)

So you have a couple options to debug from here. You can define the fallback controller call/2 and inspect in there, or put an inspect in your changeset pipeline to see what’s going wrong. (The error is actually in the previous error you posted, at the very end of the line)

I know this is a lot so let me know if you have any questions! Also here’s the documentation on the fallback controller with good examples!

axelson

axelson

Scenic Core Team

If you’re trying to debug what’s happening you should use IO.inspect instead of IO.puts:

def call(conn, {:error, changeset}) do
  IO.inspect(changeset, label: "changeset")
  IO.inspect(conn, label: "conn")
end

More info at:

Last Post!

JackMaarek

JackMaarek

I see this is very helpful.
Thanks for the ressource !

Where Next?

Popular in Discussions Top

ricklove
I was just introduced to Elixir and Phoenix. I was told about the 2 million websocket test that was done 2 years ago. From my research, t...
New
joeerl
I’m playing with Elixir - It’s fun. I think @rvirding does give Elixir courses these days. Re: files and database - when I given Erlang ...
New
tomekowal
Hey guys! I want to create a toy project that shows a chart of temperature over time and updates every 5 seconds. I feel LiveView is per...
New
eteeselink
Hi all, In the last days, two things happened: A blog post titled “They might never tell you it’s broken” made the rounds. It’s about ...
New
opsb
We’re considering our architecture from a viewpoint of scaling our traffic heavily over the next 6 months. Our current deployment is runn...
New
nunobernardes99
Hi there Elixir friends :vulcan_salute: In a recent task I was on, I needed to check in two dates which of them is the maximum and which...
New
sergio
Kind of like when jquery came out, it was super necessary. Existing drag and drop libraries have a bunch of baggage to support old browse...
New

Other popular topics Top

joaquinalcerro
Hi there, I am working with Ecto-Postgresql and I need to call all of the records from a specific table but the table has 40,000 records...
New
aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
alice
Hey, Just curious what are the main benefits of Elixir compared to Clojure? When is Elixir more useful than Clojure and vice versa? Th...
New
AngeloChecked
What learn first? Rust or Elixir Hi Elixir community! I’m here because i want learn a new language. I’m a junior developer and mainly i ...
New
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New
jason.o
In the code below, if the create action is not set to accept “extra_key” as an input, it errors out with a message shown above. Is there ...
New

We're in Beta

About us Mission Statement