Problem with assoc following the phoenix doc guide

Hi everyone,

As i promised yesterday i created a minimal example using the official docs of the phoenix guides for an assoc from this link https://hexdocs.pm/phoenix/contexts.html#in-context-relationships

But still can’t manage to build the assoc by using the guide.

So for my example i used:

  • Posts

  • Categories

Even though i get no errors i don’t get an category_id in the posts table after i create a post.

I uploaded the full code to GitHub maybe someone can explain to me why this is happening.

here is the link https://github.com/wolfiton/balu.

Also I think the wierd part is that the select for categories is displayed correctly and i get no error when I submit the new post with a category selected.

1 Like

I cloned the project and managed to make it works.

Here are the thing I had to fix:

  • In the schema Balu.Blog.Post the correct type for the field published should be :boolean and not :string.
  • In the controller action BaluWeb.PostController.create you need to assign the categories as you did in the new action. If not when the form will be displayed back when insertion failed, @categories won’t be found and you’ll have an exception.
  • And the most important thing is Balu.Blog.Post.changeset. I replaced it with:
@doc false
  def changeset(post, attrs) do
    post
    |> cast(attrs, [:title, :content, :published, :category_id])
    |> validate_required([:title, :content, :published, :category_id])
    |> foreign_key_constraint(:category_id, message: "Category not found!")
    |> unique_constraint(:title)
  end

and now articles category id is correctly recorded.

So the thing to understand here is that you don’t have to use cast_assoc to insert an article with its category id. Just cast the category_id field like the other fields.

Maybe this will help you in your understanding: https://medium.com/@lauraannwilliams/you-dont-have-to-use-put-assoc-or-cast-assoc-48b8575be3ce

2 Likes

Thanks @Kurisu i will have a look at the article and try those changes that you suggested now

1 Like

Also it seems that I don’t need to reinforce the rule on the controller if i put it on the blog context create

Here is my code that works https://github.com/wolfiton/balu.