Nouvelle erreur dans ActiveRecord lors de l'activation de l'utilisateur depuis rails c

Précédemment (il y a quelques mois), j’ai pu créer des utilisateurs avec :

sudo -s
cd /var/discourse
./launcher enter app
rails c
u = User.create(username: "dunderhead", email: "dunderhead@live.com", password: "password")
u.activate

Maintenant, l’étape d’activation échoue avec :

[7] pry(main)> u.activate
ActiveRecord::RecordNotSaved: You cannot call create unless the parent is saved
from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record
/associations/collection_association.rb:342:in `_create_record

Que dois-je faire ?

L’utilisateur obtient-il un ID utilisateur lorsque vous en créez un ? Je suppose que non, mais je ne sais pas pourquoi.

1 « J'aime »

Non.

[4] pry(main)> u = User.create(username: "dunderhead", email: "dunderhead@live.com", password: "password")
=> #<User:0x00007fb0c48b17e0
 id: nil,
 username: "dunderhead",
 created_at: nil,
 updated_at: nil,
 name: nil,
 seen_notification_id: 0,
 last_posted_at: nil,
 password_hash: nil,
 salt: nil,
 active: false,
 username_lower: nil,
 last_seen_at: nil,
 admin: false,
 last_emailed_at: nil,
 trust_level: 0,
 approved: false,
 approved_by_id: nil,
 approved_at: nil,
 previous_visit_at: nil,
 suspended_at: nil,
 suspended_till: nil,
 date_of_birth: nil,
 views: 0,
 flag_level: 0,
 ip_address: nil,
 moderator: false,
 title: nil,
 uploaded_avatar_id: nil,
 locale: nil,
 primary_group_id: nil,
 registration_ip_address: nil,
 staged: false,
 first_seen_at: nil,
 silenced_till: nil,
 group_locked_trust_level: nil,
 manual_locked_trust_level: nil,
 secure_identifier: nil,
 last_digest_at: nil,
 flair_group_id: nil,
 last_seen_reviewable_id: nil,
 password_algorithm: nil>

J’ai essayé de sauvegarder l’utilisateur avant de l’activer, comme le suggérait l’erreur, mais sans succès. Je ne sais pas ce que le message d’erreur veut dire par « parent ».

[5] pry(main)> u.save
=> false
[6] pry(main)> u.activate
ActiveRecord::RecordNotSaved: You cannot call create unless the parent is saved
from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/
associations/collection_association.rb:342:in `_create_record'

Vous échouez ici à la validation, c’est pourquoi.

par exemple, le mot de passe est trop court.

Vous pouvez faire remonter l’exception en faisant ceci :

u.save!

ce qui donne, par exemple :

ActiveRecord::RecordInvalid: Validation failed: Password is too short (minimum is 10 characters)
from /home/robert/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/activerecord-7.0.8.1/lib/active_record/validations.rb:80:in `raise_validation_error'

Un moyen plus rapide d’y parvenir aurait été d’ajouter un point d’exclamation après le create :

 u = User.create!(username: "dunderhead", email: "dunderhead@live.com", password: "password")

Un ID ne sera pas attribué tant que vous n’aurez pas donné à l’objet des attributs entièrement valides, soit lors de la création, soit lors de la sauvegarde après les avoir corrigés.

Ce n’est que lorsque vous avez un objet instancié que vous pouvez exécuter des méthodes sur celui-ci.

4 « J'aime »

Merci les gars, le mot de passe était trop court. Tout va bien maintenant.

1 « J'aime »

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.