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:
def changeset(post, attrs) do
|> cast(attrs, [:title, :content, :published, :category_id])
|> validate_required([:title, :content, :published, :category_id])
|> foreign_key_constraint(:category_id, message: "Category not found!")
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.