Précédent   Forum du club des développeurs et IT Pro > Autres langages > Autres langages > Ruby > Ruby on Rails
Ruby on Rails Le forum sur le framework Ruby on Rails. Voir aussi la FAQ RoR et les cours RoR.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 25/07/2012, 14h27   #1
xkram
Invité de passage
 
Homme
Étudiant
Inscription : 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 : 0
Points : 0
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 :
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 :
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 :
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 :
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
xkram est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2012, 09h13   #2
v.charlet
Membre actif
 
Homme Vincent Charlet
Ingénieur développement logiciels
Inscription : novembre 2011
Messages : 115
Détails du profil
Informations personnelles :
Nom : Homme Vincent Charlet
Localisation : France, Somme (Picardie)

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

Informations forums :
Inscription : novembre 2011
Messages : 115
Points : 190
Points : 190
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 :
1
2
3
4
class UserHasPin < ActiveRecord::Base
 
  belongs_to :user
  belongs_to :pin


Code :
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 :
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 !
v.charlet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2012, 10h01   #3
v.charlet
Membre actif
 
Homme Vincent Charlet
Ingénieur développement logiciels
Inscription : novembre 2011
Messages : 115
Détails du profil
Informations personnelles :
Nom : Homme Vincent Charlet
Localisation : France, Somme (Picardie)

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

Informations forums :
Inscription : novembre 2011
Messages : 115
Points : 190
Points : 190
j'ai trouvé le temps de tester:
Code :
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 :
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 :
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")
  &#8592;[1m&#8592;[36m (0.0ms)&#8592;[0m  &#8592;[1mbegin transaction&#8592;[0m
  &#8592;[1m&#8592;[35mSQL (37.0ms)&#8592;[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]]
  &#8592;[1m&#8592;[36m (6.0ms)&#8592;[0m  &#8592;[1mcommit transaction&#8592;[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")
  &#8592;[1m&#8592;[35m (0.0ms)&#8592;[0m  begin transaction
  &#8592;[1m&#8592;[36mSQL (2.0ms)&#8592;[0m  &#8592;[1mINSERT INTO "pins" ("created_at", "title", "updated_at") VALUES (?, ?, ?)&#8592;[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]]
  &#8592;[1m&#8592;[35m (8.0ms)&#8592;[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()
  &#8592;[1m&#8592;[36m (0.0ms)&#8592;[0m  &#8592;[1mbegin transaction&#8592;[0m
  &#8592;[1m&#8592;[35mSQL (2.0ms)&#8592;[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]]
  &#8592;[1m&#8592;[36m (5.0ms)&#8592;[0m  &#8592;[1mcommit transaction&#8592;[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)
  &#8592;[1m&#8592;[35m (0.0ms)&#8592;[0m  begin transaction
  &#8592;[1m&#8592;[36mSQL (1.0ms)&#8592;[0m  &#8592;[1mINSERT INTO "user_has_pins" ("created_at", "pin_id", "updated_at", "user_id") VALUES (?, ?, ?, ?)&#8592;[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]]
  &#8592;[1m&#8592;[35m (4.0ms)&#8592;[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
  &#8592;[1m&#8592;[36mPin Load (0.0ms)&#8592;[0m  &#8592;[1mSELECT "pins".* FROM "pins" INNER JOIN "user_has_pins" ON "pins"."id" = "user_has_pins"."pin_id" WHERE "user_has_pins"."user_id" = 1&#8592;[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
  &#8592;[1m&#8592;[35mUser Load (1.0ms)&#8592;[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
  &#8592;[1m&#8592;[36mUser Load (1.0ms)&#8592;[0m  &#8592;[1mSELECT "users".* FROM "users" INNER JOIN "user_has_pins" ON "users"."id" = "user_has_pins"."user_id" WHERE "user_has_pins"."pin_id" = 2&#8592;[0m
=> []
v.charlet est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 13h51.


 
 
 
 
Partenaires

Hébergement Web