J'ai créé une fonction de réponse pour l'extension Rails Tutorial (Partie 5):

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, nous avons créé et testé un modèle qui rend l'utilisateur unique. Ensuite, ajoutez des fonctions aux mises à jour / modifications utilisateur.

Vérification des modifications dans la vue de l'utilisateur

Pensez à où et comment ajouter un_nom_unique. Relisez le chapitre 7 du didacticiel. 7.1 Utilisateurs d'affichage Ajouter un nom_unique aux éléments à afficher 7.2 Formulaire d'inscription de l'utilisateur Ajouter un nom_unique aux éléments à saisir 7.3 Échec d'enregistrement de l'utilisateur Ajouté au message d'erreur, ajouté au test 7.4 Enregistrement d'utilisateur réussi ajouté au test en cas de succès

Relisez le chapitre 10 Mise à jour / affichage / suppression de l'utilisateur. 10.1 Mettre à jour l'utilisateur Ajouter un nom_unique aux éléments d'entrée 10.3 Afficher tous les utilisateurs Nom_unique ajouté aux éléments affichés

Je pense que cela le couvre.

Changer la vue de l'utilisateur

7.1 Changer la vue de l'utilisateur. Sur l'écran, nous mettrons un @ au début pour l'identifier comme un nom_unique.

ruby:views/users/show.html.erb


      <h1>
        <%= gravatar_for @user %>
        <%= @user.name%>
        @<%= @user.unique_name%>
      </h1>

7.2 Ajouter au formulaire d'inscription de l'utilisateur. Quand j'ai cherché quel fichier et regardé new.html.erb, il a dit render'form '. Je savais que je devais l'ajouter au formulaire.

ruby:views/users/_form.html.erb


    <%= f.label :name %>
    <%= f.text_field :name, class: 'form-control' %>
    
    <%= f.label :email %>
    <%= f.email_field :email, class: 'form-control'  %>

    <%= f.label :unique_name %>
    <%= f.text_field :unique_name, class: 'form-control'  %>
    
    <%= f.label :password %>
    <%= f.password_field :password, class: 'form-control' %>

Ensuite, regardez le profileur.

J'ai regardé 7.3.2 Strong Parameters et j'ai trouvé où l'ajouter.

controllers/users_controller.rb


  private
    def user_params
        params.require(:user).permit(:name, :email, :password, 
                                     :password_confirmation, :unique_name)
    end

7.3.3 Relisez le message d'erreur. Pour le message d'erreur de la figure 7.18, nous savons que nom_unique devrait également générer une erreur. Unique name can't be blank Unique name has already been taken

Test d'enregistrement des utilisateurs

Listing 7.23: Ajouter des tests ainsi que des tests pour les enregistrements d'utilisateurs non valides.

ubuntu:~/environment/sample_app (reply-micropost) $ rails test test/integration/users_signup_test.rb 
 FAIL["test_valid_signup_information_with_account_activation", UsersSignupTest, 1.2921500019999712]
 test_valid_signup_information_with_account_activation#UsersSignupTest (1.29s)
        "User.count" didn't change by 1.
        Expected: 36
          Actual: 35
        test/integration/users_signup_test.rb:29:in `block in <class:UsersSignupTest>'

J'ai essayé d'exécuter le test avant de l'ajouter et il s'est avéré être ROUGE. Je pensais que l'ajout d'un utilisateur était une erreur car il n'y avait pas de nom_unique dans le test test_valid_signup_information_with_account_activation enregistré normalement. Ajoutez un nom_unique.

test/integration/users_signup_test.rb GREEN


    test "valid signup information with account activation" do
      get signup_path
      assert_difference 'User.count', 1 do
        post users_path, params: { user: {name:  "Example User",
                                          email: "[email protected]",
                                          password:              "password",
                                          password_confirmaiton: "password",
                                          unique_name: "Example1"} }
      end

Le test ayant réussi, j'ai décidé de lancer le serveur et d'enregistrer l'utilisateur à partir de l'écran.

Tout d'abord, remplissez à nouveau la base de données pour supprimer les utilisateurs que vous avez entrés dans le test.

ubuntu:~/environment/sample_app (reply-micropost) $ rails db:migrate:reset
ubuntu:~/environment/sample_app (reply-micropost) $ rails db:seed

J'ai également eu une erreur en double. En tant que débogage, quand j'ai essayé de sortir nom_unique avec put, Jeramy était sorti deux fois. Faker pense que first_name seul n'est pas unique, alors il décide d'ajouter un nombre après first_name.

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}#{n+1}"

Ça s'est bien passé. Regardons quelques données dans la console.

>> User.last
  User Load (0.2ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT ?  [["LIMIT", 1]]
=> #<User id: 100, name: "Dorian Greenfelder", email: "[email protected]", created_at: "2020-10-24 02:06:54", updated_at: "2020-10-24 02:06:54", password_digest: "$2a$10$syodSOoCtHmdP/vi20.LgOou95cxRnHino0IhRRcxQN...", remember_digest: nil, admin: false, activation_digest: "$2a$10$LAs1aWDvwZIS0UPWhTR47.9BIGQPQ4eY16qFJT148dY...", activated: true, activated_at: "2020-10-24 02:06:54", reset_digest: nil, reset_sent_at: nil, unique_name: "Alejandrin99">

Lorsque j'ai démarré le serveur et enregistré l'utilisateur à partir de l'écran, j'ai pu m'inscrire avec succès. input_form.png show.png

Test de mise à jour de l'utilisateur

Lisez 10.1 «Mettre à jour les utilisateurs» dans le didacticiel. Lorsque j'ai essayé de mettre à jour l'utilisateur à partir de l'écran, il n'y avait pas d'erreur et la mise à jour a réussi.

Le test est susceptible d'être ROUGE comme il l'était lors de l'inscription, je vais donc l'essayer.

ubuntu:~/environment/sample_app (reply-micropost) $ rails test test/integration/users_edit_test.rb 
 FAIL["test_successful_edit", UsersEditTest, 1.2000509099998453]
 test_successful_edit#UsersEditTest (1.20s)
        Expected true to be nil or false
        test/integration/users_edit_test.rb:33:in `block in <class:UsersEditTest>'

En réfléchissant à la cause, j'ai remarqué que je n'ai pas ajouté unique_name à l'utilisateur de l'appareil.

test/fixtures/users.yml


michael:
  name: Michael Example
  email: [email protected]
  password_digest: <%= User.digest('password') %>
  admin: true
  activated: true
  activated_at: <%= Time.zone.now %>  
  unique_name: Michael1

archer:
  name: Sterling Archer
  email: [email protected]
  password_digest: <%= User.digest('password') %>
  activated: true
  activated_at: <%= Time.zone.now %>  
  unique_name: Archer1

Ajoutez également la modification de nom_unique au test des modifications réussies.

test/integration/users_edit_test.rb


  test "successful edit" do
    log_in_as(@user)
    get edit_user_path(@user)
    assert_template 'users/edit'
    name = "Foo Bar"
    email = "[email protected]"
    unique_name = "Foo1"
    patch user_path(@user), params: { user: { name: name,
                                              email: email,
                                              password:              "",
                                              password_confirmation: "",
                                              unique_name: unique_name} }

Ajoutez également la modification de nom_unique au test d'échec.

test/integration/users_edit_test.rb RED


  test "unsuccessful edit" do
    log_in_as(@user)
    #log_in(@user)
    get edit_user_path(@user)
    assert_template 'users/edit'
    patch user_path(@user), params: { user: {name: "",
                                            email: "foo@invalid",
                                            password:              "foo",
                                            password_confirmation: "bar",
                                            unique_name: "" } }
    assert_template 'users/edit'
    assert_select "div.alert", "The form contains 4 errors."
  end
test_unsuccessful_edit#UsersEditTest (0.94s)
        <The form contains 4 errors.> expected but was
        <The form contains 5 errors.>..
        Expected 0 to be >= 1.
        test/integration/users_edit_test.rb:20:in `block in <class:UsersEditTest>'

Puisque l'erreur de nom_unique est augmentée de un, elle est devenue ROUGE comme prévu. Lorsque j'ai augmenté le nombre d'erreurs de 4 à 5, il est devenu VERT.

test/integration/users_edit_test.rb GREEN


  test "unsuccessful edit" do

    assert_select "div.alert", "The form contains 5 errors."
  end

Test de la liste d'utilisateurs

10.3 Lisez «Afficher Afficher tous les utilisateurs». Afficher nom_unique à côté du nom.

ruby:app/views/users/_user.html.erb


<li>
  <%= gravatar_for user, size: 50 %>
  <%= link_to user.name, user %>
  <%= "@" + user.unique_name %>

J'ai exécuté le test d'index et c'était VERT. test/integration/users_index_test.rb

Tous les tests

Essayez d'exécuter tous les tests.

FAIL["test_profile_display", UsersProfileTest, 0.9564320010000529]
 test_profile_display#UsersProfileTest (0.96s)
        <Michael Example> expected but was
        <Michael Example
                @Michael1>..
        Expected 0 to be >= 1.

Il y a une erreur dans le test de profil. La chaîne h1 ne correspond pas exactement au nom Changez pour "Inclure le nom". J'ai cherché sur le net et j'ai trouvé que les expressions régulières peuvent être utilisées pour assert. https://zariganitosh.hatenablog.jp/entry/20080405/1207455670

assert_select "title", /Welcome/ #Succès si la chaîne de balise de titre contient "Bienvenue".

Reportez-vous à l'article et modifiez-le.

test/integration/users_profile_test.rb GREEN


 test "profile display" do
    get user_path(@user)
    assert_template 'users/show'
    assert_select 'title', full_title(@user.name)
    assert_select 'h1', /#{@user.name}/ 
    assert_select 'h1', /#{@user.unique_name}/ 

Changez l'endroit où le nom a été utilisé en réponse pour utiliser nom_unique

controllers/microposts_controller.rb


  def create
    @micropost = current_user.microposts.build(micropost_params)
      #Vérifier la réponse
      if reply_id =  @micropost.content.scan(/@\w+/)[0]
        reply_id.slice!(0)
        @micropost.in_reply_to = User.find_by(unique_name: reply_id).id
      end

Tester

test/controllers/microposts_controller_test.rbubuntu:~/environment/sample_app (reply-micropost) $ rails test
ERROR["test_reply_to_user_", ReplyTest, 2.186517049000031]
 test_reply_to_user_#ReplyTest (2.19s)
NoMethodError:         NoMethodError: undefined method `id' for nil:NilClass
            app/controllers/microposts_controller.rb:10:in `create'
            test/integration/reply_test.rb:14:in `block in <class:ReplyTest>'

Je me demandais si le test entraînerait une erreur causée en utilisant le nom pour la réponse et en ne le modifiant pas encore, mais j'ai eu une erreur différente. Le message indique que User.find_by (unique_name: reply_id) est nul. Je pense que c'est parce que find_by est introuvable. Déboguer avec des put.

controllers/microposts_controller.rb


  def create
    @micropost = current_user.microposts.build(micropost_params)
      #Vérifier la réponse
      if reply_id =  @micropost.content.scan(/@\w+/)[0]
        reply_id.slice!(0)
        puts (User.find_by(unique_name: reply_id) == nil) 

Puisque la sortie des put était vraie, changez le contrôleur de sorte qu'il ne fasse rien en cas de Not Found.

controllers/microposts_controller.rb


def create
    @micropost = current_user.microposts.build(micropost_params)
      #Vérifier la réponse
      if reply_id =  @micropost.content.scan(/@\w+/)[0]
        reply_id.slice!(0)
        if reply_user = User.find_by(unique_name: reply_id)  
          @micropost.in_reply_to = reply_user.id
        end
      end

Quand je l'ai testé, l'erreur précédente a disparu et j'ai eu une autre erreur.

ubuntu:~/environment/sample_app (reply-micropost) $ rails test
 FAIL["test_reply_to_user_", ReplyTest, 1.5751866470000095]
 test_reply_to_user_#ReplyTest (1.58s)
        Expected /@Bob\ reply\ test\ content/ to match "<!DOCTYPE html> ...
 <h3>Micropost Feed</h3>\n            \n        </div>\n    </div>\n\n 

L'erreur est que la publication de la réponse n'est pas affichée dans le flux.

J'ai réalisé que je n'avais pas changé la réponse publiée dans le test de name à unique_name. Quand je l'ai changé, il est devenu VERT.

test/integration/reply_test.rb GREEN


 test "reply to user " do
    log_in_as(@user)
    content = "@#{@other.unique_name} reply test content"

Test depuis l'écran

Démarrez le serveur et testez-le depuis l'écran. unique_error.png Figure. Test de la duplication d'un utilisateur unique

index.png Figure. La liste des utilisateurs @ unique_user a été ajoutée

J'essaierai d'entrer une réponse. Expéditeur: @Exemple Destinataire: @testb

reply_test1.png Figure. Entrez la réponse

Le message de réponse s'affiche sur l'écran d'accueil de l'expéditeur. reply_test2.png Figure. Montré à l'expéditeur de la réponse

Reconnectez-vous en tant que destinataire de la réponse et affichez l'écran d'accueil. Le message de réponse s'affiche. reply_test3.png Figure. la réponse s'affiche sur l'écran d'accueil du destinataire de la réponse

Le message de réponse ne s'affiche pas sur l'écran de présentation du destinataire. reply_test4.png Figure. La réponse est masquée sur l'écran de présentation du destinataire de la réponse

Vérifiez les spécifications de l'écran d'affichage

La réponse n'apparaît pas sur l'écran de présentation du destinataire. Réfléchissez à pourquoi et voyez si vous n'utilisez pas la méthode d'alimentation.

app/controllers/users_controller.rb


 def show
    @user = User.find(params[:id])
    @microposts = @user.microposts.paginate(page: params[:page])
    redirect_to root_url and return unless @user.activated == true
  end

Je n'ai pas utilisé la méthode d'alimentation. Vérifiez si cette spécification répond à vos exigences. Le fait est que l'émission peut être utilisée par des personnes qui ne sont pas connectées.

En regardant en arrière quand j'ai décidé des exigences,

・ Lorsqu'un tiers affiche l'écran d'alimentation du destinataire, la réponse n'est pas affichée.

J'avais décidé des exigences. Alors j'ai trouvé qu'il n'y avait pas de problème.

Vérifiez ensuite les exigences pour voir si elles doivent être visibles par les abonnés. En regardant en arrière quand j'ai décidé des exigences,

Les abonnés de l'expéditeur de la réponse sont visibles. Les abonnés du destinataire de la réponse ne sont pas visibles.

était. Cela semble être confirmé dans le test de suivi, alors confirmez-le.

test/integration/following_test.rb


 test "feed on Home page" do
    get root_path
    @user.feed.paginate(page: 1).each do |micropost|
      assert_match CGI.escapeHTML(micropost.content), response.body
    end
  end

J'ai pu le confirmer car j'ai utilisé du flux.

En fait, vérifiez sur l'écran. Trouvez des abonnés @Example en tant qu'expéditeurs En regardant les semences, les utilisateurs [3..40] suivent. Connectez-vous avec l'un d'entre eux. name:Gladys Kuhlman  email:[email protected] La réponse a été affichée.

Vérifiez l'écran des abonnés du destinataire de la réponse. Il n'y avait aucun abonné de @testb. C'est l'utilisateur [2] qui ne suit pas l'expéditeur. name:Horacio Kautzer email:[email protected] Connectez-vous avec. Suivez @testb depuis l'écran. Je suis retourné à l'écran d'accueil et comme la réponse n'était pas affichée, j'ai pu confirmer que l'opération était correcte.

J'ai remarqué que l'ancienne spécification @ était écrite en graines et je l'ai corrigée. C'est juste un problème esthétique, donc cela n'affecte pas le test, mais je ne veux pas le voir plus tard, alors je l'ai corrigé.

/sample_app/db/seeds.rb


sender   = users.first
receiver = users.second
reply_content = "@#{receiver.unique_name} reply test"
sender.microposts.create!(content: reply_content,
                          in_reply_to: receiver.id)

Ceci termine la fonction de réponse.

Temps requis

5,5 heures du 23/10 au 26/10. Dans l'ensemble de la fonction de réponse, 9 / 27-10 / 26, la journée de travail est de 29 jours, totalisant 22 heures.

Recommended Posts

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 créé une fonction de réponse pour l'extension Rails Tutorial (Partie 4): une fonction qui rend l'utilisateur unique
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
J'ai créé un outil de vérification pour le module de version
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 2
Tutoriel pour créer un blog avec Rails pour les débutants Partie 0
J'ai fait une simple fonction de recommandation.
J'ai créé un plug-in pour IntelliJ IDEA
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 créé une image Docker pour la version japonaise de SDAPS
J'ai fait une méthode pour demander la prime vendredi
Remarque sur l'initialisation des champs dans le didacticiel Java
Que dois-je utiliser pour le framework de test [Rails]
Je souhaite définir une fonction dans la console Rails
J'ai créé une bibliothèque pour afficher des tutoriels sur Android.
J'ai créé une fonction pour enregistrer des images avec l'API dans Spring Framework. Partie 1 (édition API)
Je souhaite ajouter une fonction de suppression à la fonction de commentaire
J'ai créé une fonction pour enregistrer des images avec l'API dans Spring Framework. Partie 2 (édition client)
J'ai essayé de faire une version japonaise de la transmission automatique du courrier de Rails / devise
J'ai créé un environnement de développement avec rails6 + docker + postgreSQL + Materialise.
[Rails] J'ai essayé d'utiliser la méthode button_to pour la première fois
Je souhaite implémenter une fonction d'édition des informations produit ~ part1 ~
Une note sur la fonction de départ de Ruby on Rails
J'ai essayé JAX-RS et pris note de la procédure
Je souhaite créer un formulaire pour sélectionner la catégorie [Rails]
Modéliser Digimon avec DDD pour la première fois Partie 1
Rails ~ Comprendre la fonction de message ~
[Rails] Implémentation de la fonction tutoriel
Lorsque j'ai créé un graphique à barres avec MPAndroidChart, l'étiquette de l'axe des x était mal alignée pour une raison quelconque
Une demi-année d'auto-apprentissage fait du SPA avec Rails + Nuxt.js, alors jetez un œil
[Rails] J'ai créé une mini-application de calendrier simple avec des spécifications personnalisées.
Implémentez une fonction de recherche affinée pour plusieurs modèles sans gemme Rails5.
Je souhaite ajouter une fonction de navigation avec ruby on rails
J'ai essayé d'implémenter la fonction de prévisualisation d'image avec Rails / jQuery
J'ai récemment créé une application js dans le langage courant de Dart
J'ai fait un petit bijou pour poster le texte du mode org sur qiita
J'ai posé une question qui peut être utilisée pour des entretiens techniques
Création d'une méthode pour demander Premium Friday (version Java 8)
J'ai créé un outil pour afficher la différence du fichier CSV
[Auto-apprentissage] Création d'un portfolio (application d'origine) après avoir terminé le didacticiel Rails