J'ai créé une fonction de réponse pour l'extension Rails Tutorial (Partie 4): une fonction qui rend l'utilisateur unique

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.

Capacité à rendre les utilisateurs uniques

conception de changement de modèle

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
email 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.

Codage de changement de modèle

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

test de changement de modèle

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.

Temps requis

3,5 heures du 18/10 au 22/10.

Recommended Posts

J'ai créé une fonction de réponse pour l'extension Rails Tutorial (Partie 4): une fonction qui rend l'utilisateur unique
J'ai créé une fonction de réponse pour l'extension Rails Tutorial (Partie 1)
J'ai créé une fonction de réponse pour l'extension Rails Tutorial (Partie 5):
J'ai créé une fonction de réponse pour l'extension Rails Tutorial (Partie 2): Changer de modèle
J'ai essayé de faire une fonction de réponse de l'extension Rails Tutorial (Partie 3): Correction d'un malentendu des spécifications
J'ai essayé de créer une fonction de message de l'extension Rails Tutorial (Partie 1): Créer un modèle
J'ai essayé de créer une fonction de message pour l'extension Rails Tutorial (Partie 2): Créer un écran à afficher
[Rails] J'ai créé une fonction de brouillon en utilisant enum
Tutoriel pour créer un blog avec Rails pour les débutants Partie 1
Tutoriel pour créer un blog avec Rails pour les débutants Partie 0
J'ai créé une action GitHub qui facilite la compréhension du résultat de l'exécution de RSpec
J'ai posé une question qui peut être utilisée pour des entretiens techniques
J'ai fait une simple fonction de recommandation.
J'ai essayé d'implémenter la fonction de téléchargement d'images multiples dans Rails afin que plusieurs images puissent être glissées pour le message
J'ai créé un plug-in pour IntelliJ IDEA
Présentation de Spring Boot Actuator, une fonctionnalité qui facilite l'utilisation des applications Spring Boot
J'ai créé un client API THETA qui peut être utilisé pour le développement de plugins
J'ai recherché un framework léger qui répondrait au soudain "faites-le vite"
[Incontournable pour les ingénieurs débutants] Une histoire que le monde s'est étendue lorsque j'ai exploité un service Web que j'ai créé moi-même
J'ai créé un outil Diff pour les fichiers Java
Utilisez [Rails] pour concevoir la fonction utilisateur invité (pour le portefeuille)
J'ai créé une application de visualisation qui affiche le PDF
J'ai créé une bibliothèque d'extension Ruby en C
J'ai créé un robot LINE avec Rails + heroku
J'ai fait un portfolio avec Ruby On Rails
J'ai écrit un code de test (Junit & mockit) pour le code qui appelle l'API AWS (Java)
Lorsque j'ai créé un utilisateur sur ma page, la fonction d'édition utilisateur de devise est devenue étrange.
J'ai créé une fonction pour enregistrer des images avec l'API dans Spring Framework. Partie 1 (édition API)