IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Ruby on Rails Discussion :

Relation n->m : uninitialized constant User::UserHasPin


Sujet :

Ruby on Rails

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Relation n->m : uninitialized constant User::UserHasPin
    Bonjour,

    Je suis confronté à un problème dans le cadre de mon application rails.

    Voici mon model concernant la base de donnée (sous SQLite) :


    J'ai en effet l'exception suivante : (je voulais juste faire un test pour voir si j'arrive à compter le nombre pins pour un utilisateur)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    NameError in Users#show
     
    Showing /app/views/shared/_users_pins.html.erb where line #3 raised:
     
    uninitialized constant User::UserHasPin
    Extracted source (around line #3):
     
    1: <% @user ||= current_user %>
    2: <div class="stats">
    3:  <%= @user.pins_id.count %>
    4: </div>
    Voici les 3 models qui sont associés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class UserHasPins < ActiveRecord::Base
      attr_accessible :users_id, :pins_id
      
     
      belongs_to :users_id
      belongs_to :pins_id
      
      
      validates :users_id, presence: true
      validates :pins_id, presence: true
    end
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class User < ActiveRecord::Base
    
    
      has_many :pins_id, :through => :user_has_pin 
      has_many :user_has_pin
    end
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Pins < ActiveRecord::Base
      attr_accessible :content, :title
      
      
      has_many :users_id, :through => :user_has_pin
      has_many :user_has_pin
    Si quelqu'un voit pourquoi j'ai cette exception ? =)

    Merci par avance de vos réponses

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2011
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 239
    Points : 424
    Points
    424
    Par défaut
    Je suis pas fan du nomage de tes variables et par expérience (pour avoir galeré aussi) Ruby va utiliser les transformations singulier/pluriel pour retrouver le nom de la classe liée au has_many
    d'ailleurs tu peux le forcer en utilisant la variable :class

    Revenons à ton erreur: ton modele et tes relations ne sont pas correcte, commence par regler ça !

    je ferai tellement de changement que je ne sais pas par ou commencer, les noms des classes au singulier, les belong_to au singulier et les has_many au pluriel
    (et oui, c'est un maniac de la grammaire qui à créé ce langage)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class UserHasPin < ActiveRecord::Base
     
      belongs_to :user
      belongs_to :pin


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Pin < ActiveRecord::Base
      attr_accessible :content, :title
     
     
      has_many :users, :through => :user_has_pins, :source => :user
      has_many :user_has_pins
    ajout de la :source pour aider ruby à determiner le sens de la relation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class User < ActiveRecord::Base
     
     
      has_many :pins, :through => :user_has_pins, :source => :pin
      has_many :user_has_pins
    end
    j'ai pas testé mais j'ai un modele de base qui ressemble un peu ....

    Tu peux facilement tester en utilisant la console rails, en creant un objet et en appellant la methode, cela doit te renvoyer [] puisque le lien n'existe pas, mais cela ne doit pas te planter
    (attention à chaque modification du modele, il faut relancer la console pour prendre en compte les modifications

    bon courage !

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2011
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 239
    Points : 424
    Points
    424
    Par défaut
    j'ai trouvé le temps de tester:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $ rails generate model user
    $ rails generate model pin
    $ rails generate model userHasPin
    je changerais aussi le nom de tes foreign keys
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class CreateUserHasPins < ActiveRecord::Migration
      def change
        create_table :user_has_pins do |t|
          t.integer :user_id
          t.integer :pin_id
     
          t.timestamps
        end
      end
    end
    mais ça marche beaucoup mieux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    $ rails c
    Loading development environment (Rails 3.2.2)
    irb(main):001:0> p1 = Pin.create(:title => "Pokemon")[1m←[36m (0.0ms)[0m  ←[1mbegin transaction←[0m
      ←[1m←[35mSQL (37.0ms)[0m  INSERT INTO "pins" ("created_at", "title", "updated_at") VALUES (?, ?, ?)  [["created_at", Fri, 27 Jul 2012 07:56:53 UTC +00:00], ["title", "Pokemon"], ["updated_at", Fri, 27 Jul 2012 0
    7:56:53 UTC +00:00]][1m←[36m (6.0ms)[0m  ←[1mcommit transaction←[0m
    => #<Pin id: 1, title: "Pokemon", created_at: "2012-07-27 07:56:53", updated_at: "2012-07-27 07:56:53">
    irb(main):002:0> p2 = Pin.create(:title => "Yugiho")[1m←[35m (0.0ms)[0m  begin transaction
      ←[1m←[36mSQL (2.0ms)[0m  ←[1mINSERT INTO "pins" ("created_at", "title", "updated_at") VALUES (?, ?, ?)[0m  [["created_at", Fri, 27 Jul 2012 07:57:06 UTC +00:00], ["title", "Yugiho"], ["updated_at", Fri, 27 Jul
    2012 07:57:06 UTC +00:00]][1m←[35m (8.0ms)[0m  commit transaction
    => #<Pin id: 2, title: "Yugiho", created_at: "2012-07-27 07:57:06", updated_at: "2012-07-27 07:57:06">
    irb(main):003:0> u = User.create()[1m←[36m (0.0ms)[0m  ←[1mbegin transaction←[0m
      ←[1m←[35mSQL (2.0ms)[0m  INSERT INTO "users" ("created_at", "updated_at") VALUES (?, ?)  [["created_at", Fri, 27 Jul 2012 07:57:18 UTC +00:00], ["updated_at", Fri, 27 Jul 2012 07:57:18 UTC +00:00]][1m←[36m (5.0ms)[0m  ←[1mcommit transaction←[0m
    => #<User id: 1, created_at: "2012-07-27 07:57:18", updated_at: "2012-07-27 07:57:18">
    irb(main):004:0> u.user_has_pins.create(:pin_id => 1)[1m←[35m (0.0ms)[0m  begin transaction
      ←[1m←[36mSQL (1.0ms)[0m  ←[1mINSERT INTO "user_has_pins" ("created_at", "pin_id", "updated_at", "user_id") VALUES (?, ?, ?, ?)[0m  [["created_at", Fri, 27 Jul 2012 07:57:58 UTC +00:00], ["pin_id", 1], ["updated_at", Fri, 27 Jul 2012 07:57:58 UTC +00:00], ["user_id", 1]][1m←[35m (4.0ms)[0m  commit transaction
    => #<UserHasPin id: 1, user_id: 1, pin_id: 1, created_at: "2012-07-27 07:57:58", updated_at: "2012-07-27 07:57:58">
    irb(main):005:0> u.pins[1m←[36mPin Load (0.0ms)[0m  ←[1mSELECT "pins".* FROM "pins" INNER JOIN "user_has_pins" ON "pins"."id" = "user_has_pins"."pin_id" WHERE "user_has_pins"."user_id" = 1[0m
    => [#<Pin id: 1, title: "Pokemon", created_at: "2012-07-27 07:56:53", updated_at: "2012-07-27 07:56:53">]
    irb(main):006:0> p1.users[1m←[35mUser Load (1.0ms)[0m  SELECT "users".* FROM "users" INNER JOIN "user_has_pins" ON "users"."id" = "user_has_pins"."user_id" WHERE "user_has_pins"."pin_id" = 1
    => [#<User id: 1, created_at: "2012-07-27 07:57:18", updated_at: "2012-07-27 07:57:18">]
    irb(main):007:0> p2.users[1m←[36mUser Load (1.0ms)[0m  ←[1mSELECT "users".* FROM "users" INNER JOIN "user_has_pins" ON "users"."id" = "user_has_pins"."user_id" WHERE "user_has_pins"."pin_id" = 2[0m
    => []

Discussions similaires

  1. [Doctrine2] Modéliser les relations entre users
    Par Molkobain dans le forum Doctrine2
    Réponses: 4
    Dernier message: 14/08/2013, 17h33
  2. Relation user -> message dans service messagerie interne
    Par eluus dans le forum Ruby on Rails
    Réponses: 3
    Dernier message: 28/02/2012, 00h32
  3. [reseaux] Comment creer un compte user à partir d'un formul avec perl
    Par oulai_evado dans le forum Programmation et administration système
    Réponses: 4
    Dernier message: 01/10/2002, 19h54
  4. [ADO] Constantes des types de champ
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 05/09/2002, 11h08
  5. Au sujet des constantes
    Par FranT dans le forum Langage
    Réponses: 8
    Dernier message: 09/08/2002, 11h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo