4 votes

Association ecto manquante entre les modèles

Je suis le livre "Programming Phoenix" de Chris McCord et dans le chapitre 6, une relation est créée entre un User y un Video .

En essayant de l'exécuter avec mix phoenix.server L'erreur suivante apparaît :

Request: GET /manage/videos
** (exit) an exception was raised:
    ** (ArgumentError) schema Rumbl.User does not have association :videos
        (ecto) lib/ecto/association.ex:121: Ecto.Association.association_from_schema!/2

En consultant l'errata du livre, un commentaire d'un autre utilisateur mentionne que cela se produit parce que l'utilisateur connecté n'a pas de vidéos associées.

Vous trouverez ci-dessous le contenu de user.ex

defmodule Rumbl.User do
    use Rumbl.Web, :model

    schema "users" do
        field :name, :string
        field :username, :string
        field :password, :string, virtual: true
        field :password_hash, :string

        timestamps
    end

    def changeset(user, params \\ :empty) do
        user
        |> cast(params, ~w(name username), [])
        |> validate_length(:username, min: 1, max: 20)
    end

    def registration_changeset(user, params) do
        user
        |> changeset(params)
        |> cast(params, ~w(password), [])
        |> validate_length(:password, min: 6, max: 100)
        |> put_pass_hash()
    end

    def put_pass_hash(changeset) do
        case changeset do
            %Ecto.Changeset{valid?: true, changes: %{password: pass}} ->
                put_change(changeset, :password_hash, Comeonin.Bcrypt.hashpwsalt(pass))
                _-> changeset
        end
    end
end 

Comment puis-je traiter ce cas avec élégance ?

6voto

Dogbert Points 44003

Vous avez oublié d'ajouter has_many :videos, Rumbl.Video à l'intérieur schema "users" en web/models/user.ex :

schema "users" do
  # ...
  has_many :videos, Rumbl.Video
  # ...
end

comme indiqué au chapitre 6 (page 100 du PDF p1_0) et en cet extrait .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X