Il s'agit d'une continuation de la création d'une fonction de réponse dans le chapitre 14 du didacticiel Rails. Jusqu'à la dernière fois, j'ai pu saisir et afficher la réponse. Ensuite, créez un espace pour rendre l'utilisateur unique.
Astuces dans le didacticiel
Ajoutez un nom d'utilisateur unique dans le champ d'enregistrement de l'utilisateur afin qu'il puisse être utilisé avec @reply.
Sur la base de ce qui précède, j'ai décidé d'ajouter une colonne au modèle.
Trouvez un moyen d'ajouter des colonnes de la même manière dans le didacticiel.
C'est au chapitre 9 que nous avons ajouté des colonnes au modèle utilisateur. Au cas où, assurez-vous qu'il est à jour par rapport à la source. sample_app / db / schema.rb En y regardant, admin et reset_sent_at sont assez différents. Il y en avait également dans les dossiers sous migrer. Essayez de rechercher "migra" au dos du texte. Ensuite, je me suis fait prendre au chapitre 12. J'ajoutais une colonne dans l'extrait 12.6. La figure 12.5 était la dernière.
Schéma de l'image à laquelle vous souhaitez ajouter une colonne, similaire au didacticiel.
Nom de colonne | attribut |
---|---|
id | integer |
name | string |
string | |
.. | .. |
reset_sent_at | datetime |
unique_name | string |
Figure. Modèle utilisateur avec des colonnes nommées de manière unique
Recherchez l'endroit où vous avez créé l'index unique dans le didacticiel. Essayez de rechercher «index». Puis je me suis fait prendre au chapitre 6. J'ai ajouté un index à mon adresse e-mail dans l'extrait 6.29.
Ajoutez une colonne au modèle.
ubuntu:~/environment/sample_app (reply-micropost) $ rails generate migration add_unique_name_to_users unique_name:string
Running via Spring preloader in process 2911
invoke active_record
create db/migrate/20201018232033_add_unique_name_to_users.rb
Entrez la ligne pour créer l'index à la main, en vous référant à l'extrait 6.29.
db/migrate/20201018232033_add_unique_name_to_users.rb
class AddUniqueNameToUsers < ActiveRecord::Migration[5.1]
def change
add_column :users, :unique_name, :string
add_index :users, :unique_name, unique: true
end
end
Apportez des modifications à la base de données.
ubuntu:~/environment/sample_app (reply-micropost) $ rails db:migrate
Créez un test avec un nom unique. Il aurait peut-être été préférable de le faire en premier. Ajoutez le test à user_test.rb.
test/models/user_test.rb green
def setup
@user = User.new(name: "Example User", email: "[email protected]",
password: "foobar", password_confirmation: "foobar",
unique_name: "Example")
end
test/models/user_test.rb red
test "unique_name should be present" do
@user.unique_name = " "
assert_not @user.valid?
end
Créez un test similaire à l'e-mail. J'ai fait un test et j'ai trouvé qu'il était unique mais autorisait les blancs.
La fonction pour éviter les blancs a également été créée dans la colonne e-mail, alors recherchez-la dans le didacticiel. C'était dans l'extrait 6.9. Ajoutez de la même manière.
app/models/user.rb
validates :password, presence: true, length: {minimum: 6}, allow_nil: true
validates :unique_name, presence: true, length: {maximum: 50}, uniqueness: true
J'ai pu tester qu'il était unique et n'autorisait pas les blancs.
test/models/user_test.rb green
test "unique_name shuould be unique" do
duplicate_user = @user.dup
duplicate_user.email = @user.email.upcase + "aa"
@user.save
assert_not duplicate_user.valid?
end
Vérifions les données de test sur la console.
>> user = User.first
>> user.valid?
=> false
>> user.errors.full_messages
=> ["Unique name can't be blank", "Unique name has already been taken"]
La deuxième personne est la même, alors modifiez les données de test. Modifiez-le pour inclure nom_unique. Je retirerai la partie du prénom du prénom et du nom du nom, et le prénom en anglais et le mettre dans unique_name.
db/seeds.rb
99.times do |n|
name = Faker::Name.name
email = "example-#{n+1}@railstutorial.org"
password = "password"
unique_name = name.split(' ')[0]
User.create!( name: name,
email: email,
password: password,
password_confirmation: password,
activated: true,
activated_at: Time.zone.now,
unique_name: unique_name)
end
Remettez les données dans la base de données.
$ rails db:migrate:reset
ubuntu:~/environment/sample_app (reply-micropost) $ rails db:seed
rails aborted!
ActiveRecord::RecordInvalid: Validation failed: Unique name has already been taken
/home/ubuntu/.rvm/gems/ruby-2.6.3/gems/activerecord-5.1.6/lib/active_record/validations.rb:78:in `raise_validation_error'
J'ai une erreur. Voyons combien de données ont été saisies sur la console.
> User.count
(0.2ms) SELECT COUNT(*) FROM "users"
=> 14
Il devrait y en avoir 100, mais seulement 14 sont inclus. Le message d'erreur dit "Le nom unique a déjà été pris", donc je soupçonne que le nom unique est dupliqué. Essayez-le sur la console pour voir pourquoi il se chevauche.
ubuntu:~/environment/sample_app (reply-micropost) $ rails console
>> 99.times do |n|
?> name = Faker::Name.name
>> puts name.split(' ')[0].split(' ')[0]
>> end
Mr.
Forest
Araceli
Mrs.
Cody
Mr.
J'étais en train de marcher sur le fait que je pouvais récupérer le prénom, mais le premier mot du nom était MR. M. Semble avoir diverses variantes telles que Mme, et je pense qu'il est difficile de le rendre unique avec une logique simple, alors je vais renoncer à le supprimer. Modifiez le nom et le nom unique en tant que valeurs non pertinentes.
db/seeds.rb
99.times do |n|
name = Faker::Name.name
email = "example-#{n+1}@railstutorial.org"
password = "password"
unique_name = Faker::Name.first_name
User.create!( name: name,
email: email,
password: password,
password_confirmation: password,
activated: true,
activated_at: Time.zone.now,
unique_name: unique_name)
end
Remettez les données dans la base de données. À ce moment-là, puisque les données sont déjà incluses, initialisez-les une fois.
ubuntu:~/environment/sample_app (reply-micropost) $ rails db:migrate:reset
ubuntu:~/environment/sample_app (reply-micropost) $ rails db:seed
Aucune erreur ne s'est produite. Regardons les données sur la console pour voir si elles sont entrées.
>> User.last
User Load (0.2ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT ? [["LIMIT", 1]]
=> #<User id: 100, name: "Cassandre Cummerata", email: "[email protected]", created_at: "2020-10-21 23:25:17", updated_at: "2020-10-21 23:25:17", password_digest: "$2a$10$5/ddAbowTuZim/atIYzia.jYf5omGvECsfm0AX78v3i...", remember_digest: nil, admin: false, activation_digest: "$2a$10$wMZu8WO6BCWrvYY.oPjMReGiXs0nqJ0TuyA3OZ4QWhu...", activated: true, activated_at: "2020-10-21 23:25:17", reset_digest: nil, reset_sent_at: nil, unique_name: "Julia">
nom_unique a été défini.
3,5 heures du 18/10 au 22/10.
Recommended Posts