[RUBY] (Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 14]

supposition

・ Le tutoriel Rails est la 4ème édition ・ Cette étude est le 3e tour (2e tour après le chapitre 9) ・ L'auteur est un débutant qui a fait tout Progate

Politique de base

・ Si vous le lisez, vous ne le comprendrez pas. ・ Recherchez et résumez les termes que vous ne comprenez pas (en bas de l'article, glossaire). ・ Plongez dans ce que vous ne comprenez pas. ・ Travaillez sur tous les exercices. ・ Ne copiez pas le code autant que possible.

Dernier! !! !! !! !! Courez jusqu'au bout! !! !! !! !!

Cliquez ici pour le BGM qui décore le dernier. My Bloody Valentine "Loveless" Un morceau qui semble commencer et finir. Plus en charge d'Ochi. Écoutons tout en faisant du jus de cerveau à un volume élevé.

[14.1.1 Exercice de problème (et de solution) de modèle de données]

  1. Quel serait le résultat si vous exécutiez user.following.map (&: id) sur l'utilisateur avec id = 1 dans la figure 14.7? Astuce: rappelez-vous le modèle map (&: method_name) introduit dans 4.3.2. Par exemple, user.following.map (&: id) renvoie un tableau d'identifiants. → Ceci est correct avec une erreur de méthode même si elle est exécutée sur la console à ce stade, n'est-ce pas? suivant non défini. (Pourquoi tout le monde n'est-il pas répertorié dans le résumé des réponses de l'exercice?) Comme vous pouvez l'imaginer, il renvoie un tableau d'identifiants des utilisateurs suivis par l'utilisateur avec l'ID: 1.

2. En référence à la figure 14.7, quel sera le résultat si user.following est exécuté pour l'utilisateur avec id = 2? Aussi, user.following.map (&: id) pour le même utilisateur. Quel serait le résultat si vous couriez? → Renvoie l'id de l'utilisateur que l'utilisateur 2 suit (1 dans ce cas). Ce dernier est la séquence.

[14.1.2 Exercice d'association utilisateur / relation]

  1. Ouvrez la console et utilisez la méthode de création du tableau 14.1 pour créer une relation active. Essayez d'avoir deux ou plusieurs utilisateurs sur la base de données et créez un état dans lequel le premier utilisateur suit le deuxième utilisateur. → Ci-dessous
>> user = User.first
  User Load (0.2ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ?  [["LIMIT", 1]]
=> #<User id: 1, name: "Example User", email: "[email protected]", created_at: "2020-09-21 06:47:51", updated_at: "2020-09-21 06:47:51", password_digest: "$2a$10$nAPmDn2RaEHJcHlMrK2PK.nOxUN4ULh7yUHchZRZtSZ...", remember_digest: nil, admin: true, activation_digest: "$2a$10$l9hNDaXUmopBnprlT0H7J.YFieEB8U9OoNgA0mzcrPS...", activated: true, activated_at: "2020-09-21 06:47:51", reset_digest: nil, reset_sent_at: nil>

>> other_user = User.second
  User Load (0.2ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ? OFFSET ?  [["LIMIT", 1], ["OFFSET", 1]]
=> #<User id: 2, name: "Ms. Jerry Hermann", email: "[email protected]", created_at: "2020-09-21 06:47:52", updated_at: "2020-09-21 06:47:52", password_digest: "$2a$10$4n7IPw3AcdhW6IzNuLygIuVLA26qlTNneHXDXIqW0zp...", remember_digest: nil, admin: false, activation_digest: "$2a$10$QNHMG3qKng0pFdQdDfGNMeFZaDiddcT0z3ovdEVcOcn...", activated: true, activated_at: "2020-09-21 06:47:52", reset_digest: nil, reset_sent_at: nil>

>> user.active_relationships.create(followed_id: other_user.id)
   (0.1ms)  SAVEPOINT active_record_1
  User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
  User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 2], ["LIMIT", 1]]
  SQL (3.4ms)  INSERT INTO "relationships" ("follower_id", "followed_id", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["follower_id", 1], ["followed_id", 2], ["created_at", "2020-09-23 12:37:03.376561"], ["updated_at", "2020-09-23 12:37:03.376561"]]
   (0.1ms)  RELEASE SAVEPOINT active_record_1
=> #<Relationship id: 1, follower_id: 1, followed_id: 2, created_at: "2020-09-23 12:37:03", updated_at: "2020-09-23 12:37:03">

2. Après avoir terminé l'exercice précédent, vérifiez la valeur de active_relationship.followed et la valeur de active_relationship.follower, et assurez-vous que chaque valeur est correcte. → Il apparaît au bas de la réponse ci-dessus.

[14.1.3 Exercice de validation des relations]

  1. Assurez-vous que le test reste réussi même si vous commentez la validation dans l'extrait 14.5. (Dans les versions précédentes de Rails, cette validation était obligatoire, mais depuis Rails 5, cette validation n'est plus nécessaire. Cette fois, nous prioriserons l'implémentation de la fonction suivante, mais ce type de validation peut avoir été omis. C'est une bonne idée de se souvenir de cela dans le coin de la tête.) → C'était VERT.

[14.1.4 Suivre les notes et exercices des utilisateurs]

has_many: nom du tableau, via :: nom de la table, source :: l'ensemble original du tableau ... c'est un peu déroutant. N'aurait-il pas dû être défini par le nom utilisé dans le nom d'origine? Doute.

  1. Ouvrez la console et exécutez le code du Listing 14.9 dans l'ordre. → Ci-dessous. Ça marche.
>> user = User.first
  User Load (0.2ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ?  [["LIMIT", 1]]
=> #<User id: 1, name: "Example User", email: "[email protected]", created_at: "2020-09-21 06:47:51", updated_at: "2020-09-21 06:47:51", password_digest: "$2a$10$nAPmDn2RaEHJcHlMrK2PK.nOxUN4ULh7yUHchZRZtSZ...", remember_digest: nil, admin: true, activation_digest: "$2a$10$l9hNDaXUmopBnprlT0H7J.YFieEB8U9OoNgA0mzcrPS...", activated: true, activated_at: "2020-09-21 06:47:51", reset_digest: nil, reset_sent_at: nil>

>> other_user = User.second
  User Load (0.3ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ? OFFSET ?  [["LIMIT", 1], ["OFFSET", 1]]
=> #<User id: 2, name: "Ms. Jerry Hermann", email: "[email protected]", created_at: "2020-09-21 06:47:52", updated_at: "2020-09-21 06:47:52", password_digest: "$2a$10$4n7IPw3AcdhW6IzNuLygIuVLA26qlTNneHXDXIqW0zp...", remember_digest: nil, admin: false, activation_digest: "$2a$10$QNHMG3qKng0pFdQdDfGNMeFZaDiddcT0z3ovdEVcOcn...", activated: true, activated_at: "2020-09-21 06:47:52", reset_digest: nil, reset_sent_at: nil>

>> user.following?(other_user)
  User Exists (0.6ms)  SELECT  1 AS one FROM "users" INNER JOIN "relationships" ON "users"."id" = "relationships"."followed_id" WHERE "relationships"."follower_id" = ? AND "users"."id" = ? LIMIT ?  [["follower_id", 1], ["id", 2], ["LIMIT", 1]]
=> false

>> user.follow(other_user)
   (0.1ms)  SAVEPOINT active_record_1
  User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
  SQL (6.4ms)  INSERT INTO "relationships" ("follower_id", "followed_id", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["follower_id", 1], ["followed_id", 2], ["created_at", "2020-09-23 14:03:47.235565"], ["updated_at", "2020-09-23 14:03:47.235565"]]
   (0.1ms)  RELEASE SAVEPOINT active_record_1
  User Load (0.1ms)  SELECT  "users".* FROM "users" INNER JOIN "relationships" ON "users"."id" = "relationships"."followed_id" WHERE "relationships"."follower_id" = ? LIMIT ?  [["follower_id", 1], ["LIMIT", 11]]
=> #<ActiveRecord::Associations::CollectionProxy [#<User id: 2, name: "Ms. Jerry Hermann", email: "[email protected]", created_at: "2020-09-21 06:47:52", updated_at: "2020-09-21 06:47:52", password_digest: "$2a$10$4n7IPw3AcdhW6IzNuLygIuVLA26qlTNneHXDXIqW0zp...", remember_digest: nil, admin: false, activation_digest: "$2a$10$QNHMG3qKng0pFdQdDfGNMeFZaDiddcT0z3ovdEVcOcn...", activated: true, activated_at: "2020-09-21 06:47:52", reset_digest: nil, reset_sent_at: nil>]>

>> user.following?(other_user)
  User Exists (0.2ms)  SELECT  1 AS one FROM "users" INNER JOIN "relationships" ON "users"."id" = "relationships"."followed_id" WHERE "relationships"."follower_id" = ? AND "users"."id" = ? LIMIT ?  [["follower_id", 1], ["id", 2], ["LIMIT", 1]]
=> true

>> user.unfollow(other_user)
  Relationship Load (0.2ms)  SELECT  "relationships".* FROM "relationships" WHERE "relationships"."follower_id" = ? AND "relationships"."followed_id" = ? LIMIT ?  [["follower_id", 1], ["followed_id", 2], ["LIMIT", 1]]
   (0.1ms)  SAVEPOINT active_record_1
  SQL (0.2ms)  DELETE FROM "relationships" WHERE "relationships"."id" = ?  [["id", 1]]
   (0.1ms)  RELEASE SAVEPOINT active_record_1
=> #<Relationship id: 1, follower_id: 1, followed_id: 2, created_at: "2020-09-23 14:03:47", updated_at: "2020-09-23 14:03:47">

>> user.following?(other_user)
  User Exists (0.2ms)  SELECT  1 AS one FROM "users" INNER JOIN "relationships" ON "users"."id" = "relationships"."followed_id" WHERE "relationships"."follower_id" = ? AND "users"."id" = ? LIMIT ?  [["follower_id", 1], ["id", 2], ["LIMIT", 1]]
=> false

2. Revenons aux résultats de l'exécution de chaque commande dans l'exercice précédent et vérifions quel type de SQL était réellement produit. → Comme ci-dessus. INSÉRER et SUPPRIMER.

[14.1.5 Mémos et exercices des abonnés]

Oh oui. Est-ce la raison pour laquelle j'ai utilisé through et source dans la section précédente pour gérer une table de différents côtés? Même ainsi, follow_id est difficile à comprendre.

  1. Ouvrez la console et essayez de créer une situation dans laquelle certains utilisateurs suivent le premier utilisateur. Si le premier utilisateur est user, quelle est la valeur de user.followers.map (&: id)? → Ci-dessous
>> user = User.first
  User Load (0.2ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ?  [["LIMIT", 1]]
=> #<User id: 1, name: "Example User", email: "[email protected]", created_at: "2020-09-21 06:47:51", updated_at: "2020-09-21 06:47:51", password_digest: "$2a$10$nAPmDn2RaEHJcHlMrK2PK.nOxUN4ULh7yUHchZRZtSZ...", remember_digest: nil, admin: true, activation_digest: "$2a$10$l9hNDaXUmopBnprlT0H7J.YFieEB8U9OoNgA0mzcrPS...", activated: true, activated_at: "2020-09-21 06:47:51", reset_digest: nil, reset_sent_at: nil>
>> other1 = User.second
  User Load (0.2ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ? OFFSET ?  [["LIMIT", 1], ["OFFSET", 1]]
=> #<User id: 2, name: "Ms. Jerry Hermann", email: "[email protected]", created_at: "2020-09-21 06:47:52", updated_at: "2020-09-21 06:47:52", password_digest: "$2a$10$4n7IPw3AcdhW6IzNuLygIuVLA26qlTNneHXDXIqW0zp...", remember_digest: nil, admin: false, activation_digest: "$2a$10$QNHMG3qKng0pFdQdDfGNMeFZaDiddcT0z3ovdEVcOcn...", activated: true, activated_at: "2020-09-21 06:47:52", reset_digest: nil, reset_sent_at: nil>
>> other2 = User.third
  User Load (0.1ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ? OFFSET ?  [["LIMIT", 1], ["OFFSET", 2]]
=> #<User id: 3, name: "Bernice Rippin", email: "[email protected]", created_at: "2020-09-21 06:47:52", updated_at: "2020-09-21 06:47:52", password_digest: "$2a$10$fsftEGHfcujlrAy4h.X2VelOSKNXNDnk71MbkBPOqSA...", remember_digest: nil, admin: false, activation_digest: "$2a$10$4DlqqHWVesXipOA4xC/XAOlA70S8T6PjkH3/T4RAI7M...", activated: true, activated_at: "2020-09-21 06:47:52", reset_digest: nil, reset_sent_at: nil>

>> other1.follow(user)
   (0.1ms)  SAVEPOINT active_record_1
  User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 2], ["LIMIT", 1]]
  SQL (0.1ms)  INSERT INTO "relationships" ("follower_id", "followed_id", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["follower_id", 2], ["followed_id", 1], ["created_at", "2020-09-23 22:04:23.011442"], ["updated_at", "2020-09-23 22:04:23.011442"]]
   (0.1ms)  RELEASE SAVEPOINT active_record_1
  User Load (0.1ms)  SELECT  "users".* FROM "users" INNER JOIN "relationships" ON "users"."id" = "relationships"."followed_id" WHERE "relationships"."follower_id" = ? LIMIT ?  [["follower_id", 2], ["LIMIT", 11]]
=> #<ActiveRecord::Associations::CollectionProxy [#<User id: 1, name: "Example User", email: "[email protected]", created_at: "2020-09-21 06:47:51", updated_at: "2020-09-21 06:47:51", password_digest: "$2a$10$nAPmDn2RaEHJcHlMrK2PK.nOxUN4ULh7yUHchZRZtSZ...", remember_digest: nil, admin: true, activation_digest: "$2a$10$l9hNDaXUmopBnprlT0H7J.YFieEB8U9OoNgA0mzcrPS...", activated: true, activated_at: "2020-09-21 06:47:51", reset_digest: nil, reset_sent_at: nil>]>
>> other2.follow(user)
   (0.1ms)  SAVEPOINT active_record_1
  User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 3], ["LIMIT", 1]]
  SQL (0.1ms)  INSERT INTO "relationships" ("follower_id", "followed_id", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["follower_id", 3], ["followed_id", 1], ["created_at", "2020-09-23 22:04:33.583218"], ["updated_at", "2020-09-23 22:04:33.583218"]]
   (0.1ms)  RELEASE SAVEPOINT active_record_1
  User Load (0.1ms)  SELECT  "users".* FROM "users" INNER JOIN "relationships" ON "users"."id" = "relationships"."followed_id" WHERE "relationships"."follower_id" = ? LIMIT ?  [["follower_id", 3], ["LIMIT", 11]]
=> #<ActiveRecord::Associations::CollectionProxy [#<User id: 1, name: "Example User", email: "[email protected]", created_at: "2020-09-21 06:47:51", updated_at: "2020-09-21 06:47:51", password_digest: "$2a$10$nAPmDn2RaEHJcHlMrK2PK.nOxUN4ULh7yUHchZRZtSZ...", remember_digest: nil, admin: true, activation_digest: "$2a$10$l9hNDaXUmopBnprlT0H7J.YFieEB8U9OoNgA0mzcrPS...", activated: true, activated_at: "2020-09-21 06:47:51", reset_digest: nil, reset_sent_at: nil>]>

>> user.followers.map(&:id)
  User Load (0.2ms)  SELECT "users".* FROM "users" INNER JOIN "relationships" ON "users"."id" = "relationships"."follower_id" WHERE "relationships"."followed_id" = ?  [["followed_id", 1]]
=> [2, 3]

2. Après avoir terminé l'exercice ci-dessus, vérifiez que le résultat de l'exécution de user.followers.count correspond au nombre d'utilisateurs que vous avez suivis précédemment. → Ci-dessous

>> user.followers.count
   (0.2ms)  SELECT COUNT(*) FROM "users" INNER JOIN "relationships" ON "users"."id" = "relationships"."follower_id" WHERE "relationships"."followed_id" = ?  [["followed_id", 1]]
=> 2

3. Quel est le contenu de la sortie de l'instruction SQL suite à l'exécution de user.followers.count? Existe-t-il également des différences par rapport au résultat d'exécution de user.followers.to_a.count? Conseil: Quelle est la différence si un utilisateur compte 1 million d'abonnés? Pensez-y. → SQL est comme ci-dessus. La création d'un tableau peut prendre du temps et de la charge. Donc, seul le compte est meilleur.

>> user.followers.to_a.count
=> 2

[14.2.1 Exercice de suivi des échantillons de données]

  1. Ouvrez la console et vérifiez que les résultats de User.first.followers.count correspondent aux résultats attendus dans le Listing 14.14. → 3 ~ 48, comme prévu.
>> User.first.followers.count
  User Load (0.1ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ?  [["LIMIT", 1]]
   (0.2ms)  SELECT COUNT(*) FROM "users" INNER JOIN "relationships" ON "users"."id" = "relationships"."follower_id" WHERE "relationships"."followed_id" = ?  [["followed_id", 1]]
=> 38

2. Comme pour l'exercice précédent, confirmons que les résultats de User.first.following.count correspondent également. → C'est aussi OK

>> User.first.following.count
  User Load (0.1ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ?  [["LIMIT", 1]]
   (0.2ms)  SELECT COUNT(*) FROM "users" INNER JOIN "relationships" ON "users"."id" = "relationships"."followed_id" WHERE "relationships"."follower_id" = ?  [["follower_id", 1]]
=> 49

[14.2.2 Statistiques et [Follow] form mémos et exercices]

Routage des membres: vous pouvez ajouter un nouveau routage au routage RESTful. membre prend la forme d'un bloc. Gère les URL qui incluent les identifiants utilisateur. Si id n'est pas spécifié, utilisez collection.

  1. Accédez à / users / 2 depuis votre navigateur et vérifiez que le bouton suivant est affiché. De même, vous devriez voir un bouton Ne plus suivre dans / users / 5. Maintenant, quels sont les résultats lorsque j'accède à / users / 1? → La page de profil s'affiche

2. Affichez la page d'accueil et la page de profil à partir du navigateur et vérifiez si les informations statistiques s'affichent correctement. → Les deux statistiques s'affichent.

3. Écrivons un test pour les informations statistiques affichées sur la page d'accueil. Conseil: essayez d'ajouter au test présenté dans l'extrait 13.28. De la même manière, ajoutons un test à la page de profil. → Ci-dessous. Quand je l'ai recherché, j'ai trouvé qu'il était écrit sous la forme @ user.active (ou passive) _relationships. Puis-je utiliser l'un ou l'autre? Quand je l'ai essayé sur la console, les deux ont renvoyé le même résultat, mais peut-être parce que les relations ont moins de traitement?

saite_layout_tesr.rb


  test "stats" do
    log_in_as(@user)
    get root_path
    assert_match @user.following.count.to_s, response.body
    assert_match @user.followers.count.to_s, response.body
  end

user_profile_test.rb


  test "profile display" do
    get user_path(@user)
    assert_template 'users/show'
    assert_select 'title', full_title(@user.name)
    assert_select 'h1', text: @user.name
    assert_select 'h1>img.gravatar'
    assert_match @user.following.count.to_s, response.body
    assert_match @user.followers.count.to_s, response.body
    assert_match @user.microposts.count.to_s, response.body
    assert_select 'div.pagination', count: 1
    @user.microposts.paginate(page: 1).each do |micropost|
      assert_match micropost.content, response.body
    end
  end
>> user.active_relationships.count
   (0.1ms)  SELECT COUNT(*) FROM "relationships" WHERE "relationships"."follower_id" = ?  [["follower_id", 1]]
=> 49
>> user.following.count
   (0.2ms)  SELECT COUNT(*) FROM "users" INNER JOIN "relationships" ON "users"."id" = "relationships"."followed_id" WHERE "relationships"."follower_id" = ?  [["follower_id", 1]]
=> 49

[14.2.3 Exercices des pages [Suivants] et [Abonnés]]

  1. Ouvrez / users / 1 / followers et / users / 1 / following à partir du navigateur et vérifiez que chacun s'affiche correctement. L'image dans la barre latérale fonctionne-t-elle bien comme lien? → Okedes

2. Essayez de commenter le code associé à assert_select dans l'extrait 14.29 pour vous assurer que le test devient correctement rouge. → Ça? Sera-ce ROUGE? … Ah, non? J'ai également dû commenter le rendu. Je n'ai commenté que le bloc @users. Suivant.

ruby:show_follow.html.erb


<% provide(:title, @title) %>
<div class="row">
  <aside class="col-md-4">
    <section class="user_info">
      <%= gravatar_for @user %>
      <h1><%= @user.name %></h1>
      <span><%= link_to "view my profile", @user %></span>
      <span><b>Microposts:</b><%= @user.microposts.count %></span>
    </section>
    <section class="stats">
      <%= render 'shared/stats' %>
      <% if @users.any? %>
        <div class="user_avatars">
          <%# @users.each do |user| %>
            <%#= link_to gravatar_for(user, size: 30), user %>
          <%# end %>
        </div>
      <% end %>
    </section>
  </aside>
  <div class="col-md-8">
    <h3><%= @title %></h3>
    <% if @users.any? %>
      <ul class="users follow">
        <%#= render @users %>
      </ul>
      <%= will_paginate %>
    <% end %>
  </div>
</div>

[14.2.4 Pratique du bouton [Suivre](de base)]

  1. Ouvrez / users / 2 depuis le navigateur et exécutez [Suivre] et [Ne plus suivre]. Ça marche bien? → Ça marche!

2. Après avoir terminé l'exercice précédent, jetons un œil au journal du serveur Rails. Quel modèle est dessiné lors de l'exécution du suivi / non-suivi? → Rendering users/show.html.erb within layouts/application

[14.2.5 [Suivre] les mémos et exercices du bouton (édition Ajax)]

Implémentation Ajax: ① Entrez remote: true dans form_for. (2) Entrez la méthode respond_to dans l'action du contrôleur. Recevez les demandes Ajax. (3) Si JS est désactivé côté navigateur, ajoutez sa description au fichier config / application.rb. ④ Entrez jQuery dans le nom de l'action .js.erb. J'ai oublié jQuery ... Allez-vous l'examiner avec progate?

  1. Accédez à / users / 2 depuis votre navigateur et vérifiez si cela fonctionne. → Ouais, ça marche.

2. Après avoir confirmé dans l'exercice précédent, parcourons le journal du serveur Rails et vérifions à quoi ressemble le modèle immédiatement après avoir exécuté follow / unfollow. → Rendering relationships/create.js.erb   Rendering relationships/destroy.js.erb

[14.2.6 Notes et exercices à suivre pour tester]

Vous pouvez tester le fonctionnement d'Ajax simplement en entrant xhr: true.

  1. Mettez en commentaire chaque ligne du bloc respond_to du Listing 14.36 à tour de rôle pour voir si le test peut détecter correctement l'erreur. Quel cas de test a réellement échoué? → format.html {redirect_to @user}, un format inconnu est apparu.

2. Quel est le résultat de la suppression d'une seule des lignes avec xhr: true dans le listing 14.40? La cause du problème qui se produit à ce moment et pourquoi le test confirmé dans l'exercice précédent a détecté ce problème. Pensez-y. → Je ne sais pas combien supprimer, mais si vous le supprimez pour que la grammaire ne change pas, il sera VERT. Est-ce parce qu'il n'y a pas de format à afficher lorsque JS est désactivé? (Il est ambigu de savoir si l'exercice précédent est l'exercice 1 ou la dernière suppression ...)

[14.3.1 Exercice de motivation et de planification]

  1. En supposant que les identifiants des micro-messages sont correctement alignés (c'est-à-dire, en supposant que les publications avec des identifiants plus jeunes sont plus anciennes), que se passe-t-il lorsque vous exécutez user.feed.map (&: id) avec l'ensemble de données illustré à la figure 14.22? Voyez-vous de bons résultats? Pensez-y. Astuce: rappelez-vous le default_scope implémenté dans 13.1.4. → Un tableau d'identifiants d'utilisateur pour chaque article est-il renvoyé dans l'ordre de la date et de l'heure de publication les plus récentes? (Uniquement pour vous et les utilisateurs que vous suivez)

[14.3.2 Exercice de mise en œuvre du flux pour la première fois]

  1. Comment puis-je empêcher les propres messages de l'utilisateur actuel d'être inclus dans l'extrait 14.44? Et quel test dans l'extrait 14.42 échouerait si j'effectuais une telle modification? → ("user_id IN (?) OR user_id =?", Suivant_ids, id) Si vous connaissez la composition, vous pouvez la résoudre. Suite_ids correspond au précédent (?), Plus tard? Correspond à id. Ainsi, si vous effacez chaque ensemble, l'erreur souhaitée sera renvoyée. Si vous supprimez ce dernier ensemble cette fois-ci, #Confirm your own post Comment out Les 3 lignes suivantes de FAIL seront retournées.

user.rb


  def feed
    Micropost.where("user_id IN (?)", following_ids)
  end

2. Comment puis-je ne pas inclure les messages des abonnés dans l'extrait 14.44? Et quel test dans l'extrait 14.42 échouerait si j'effectuais une telle modification? → Le contraire de 1. Effacez l'ancien ensemble. #Vérifiez les messages des utilisateurs que vous suivez. Les 3 lignes suivantes de FAIL sont renvoyées.

3. Comment puis-je inclure des messages d'utilisateurs non suivis dans la fiche 14.44? Et quel test de la fiche 14.42 échouerait si j'apportais une telle modification? Pensez au type d'ensemble que représentent les utilisateurs et les autres ensembles. → Ce ne sont que des micro-messages, n'est-ce pas? Donc ci-dessous. FAIL confirme le dernier # post d'un utilisateur non suivi.

user.rb


  def feed
    Micropost.all
  end

[14.3.3 Exercice de sous-sélection]

  1. Écrivons un test d'intégration pour le flux sur la première page affichée sur la page d'accueil. Le listing 14.49 est ce modèle. → Ci-dessous. Si assert_match est la réponse promise.body, testez si le contenu du micropost est affiché.

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

2. Dans le code du Listing 14.49, le HTML attendu est échappé avec la méthode CGI.escapeHTML (cette méthode a le même but que CGI.escape traité en 11.2.3). Pourquoi ce code a-t-il besoin d'échapper au HTML? Pensez-y. Conseil: essayez de supprimer le processus d'échappement et examinez attentivement le contenu HTML résultant. Il y a un problème avec le contenu du micropost. Vous pouvez également utiliser la fonction de recherche de terminal (Cmd-F ou Ctrl-F) pour rechercher «désolé» pour aider à déterminer la cause. → Wow, quand je l'ai testé, j'ai eu une quantité terrible de texte d'erreur. Si vous recherchez pardon, "Vos mots avaient un sens, mais pas votre ton sarcastique." = "Vos mots ont un sens, mais votre ton ironique ne l'était pas. Je veux dire, y a-t-il quelque chose qui ne peut pas être affiché sans s'échapper?

Résumé du chapitre 14

-Vous pouvez nommer et gérer les éléments de table de manière flexible en définissant has_many dans le modèle. · Le routage peut être imbriqué pour ajouter du nouveau aux ressources. -Adoptez Ajax pour le formulaire en utilisant jQuery. ・ SQL peut être utilisé selon les besoins. ・ Le tutoriel n'est qu'un tutoriel. Sachez que vous avez enfin atteint la ligne de départ (un commandement pour vous-même).

Deux tours et demi terminés! !! Je vous remercie! !! !!

À partir du 1er septembre, c'est aujourd'hui le 25. J'ai réussi à le terminer dans le mois que je visais. Je pense que le contenu appris dans le didacticiel m'est venu à l'esprit, mais en enquêtant sur les questions à chaque fois, j'ai l'impression qu'il y a 99% de choses que je ne sais pas encore. C'est donc la dernière phrase du résumé. Au contraire, j'ai l'impression que je suis toujours debout sur la ligne de départ. Je commence juste à grimper, alors cette pente d'homme infiniment lointaine ...

Eh bien, c'est tout pour le tutoriel Rails. La prochaine étape est d'aller à l'école. À ce stade, j'ai réalisé que la capacité d'auto-propulsion et la capacité d'auto-apprentissage sont plus importantes que l'école honnête ununun. Cependant, comme le titre de l'article le suggère, je n'ai pas le temps de dire quelque chose de clément. Afin de défier le monde, il est nécessaire de se concentrer étroitement et d'étudier dans les backwaters. La prochaine étape consiste donc à étudier à l'école. Quoi qu'il en soit, je pense que c'est la même chose de rechercher et de penser par vous-même et d'écrire le code, mais cela vaut vraiment la peine de demander à l'instructeur de regarder votre code et de vous dire ce dont vous avez besoin, et cela vous fera gagner du temps. Je pense que ce sera connecté. C'est une façon adulte de dire de l'argent. Je l'imite.

Si vous avez du temps libre pour écrire quelque chose comme ça, parlez d'étudier! À la prochaine! J'aime écrire des articles, alors je ferai de mon mieux pour écrire des articles utiles un jour! !!

Cliquez ici pour le chapitre 13 Cliquez ici pour les conditions préalables et le statut de l'auteur pour l'apprentissage

Glossaire qui saisit en quelque sorte l'image

・ Ajax Abréviation de JavaScript asynchrone + XML. Une technologie qui déplace le contenu d'une page de différentes manières sans déplacer ni recharger la page.

·asynchrone Lors du transfert de données, échangez des données sans vous soucier de la synchronisation (synchronisation) entre le côté émetteur et le côté réception.

・ XML (langage de balisage extensible) Un langage de balisage extensible. Une des règles de l'écriture. Il est principalement utilisé dans le but de faciliter l'échange et la gestion des données.

・ DOM (modèle d'objet de document) Ce n'est pas le noir qui plane. Il s'agit d'un mécanisme permettant d'exploiter librement des pages Web telles que HTML à partir d'un programme, et a une structure hiérarchique (arborescence).

Recommended Posts

(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un tutoriel Rails [Chapitre 11]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 1]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 14]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 12]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 5]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 3]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 4]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 8]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 6]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 13]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 9]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 10]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 7]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 2]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Introduction]
[Tutoriel Rails Chapitre 5] Créer une mise en page
(Ruby on Rails6) Création de données dans une table
tutoriel rails Chapitre 6
tutoriel rails Chapitre 1
tutoriel rails Chapitre 7
tutoriel rails Chapitre 5
tutoriel rails Chapitre 10
tutoriel rails Chapitre 9
tutoriel rails Chapitre 8
[Tutoriel Rails Chapitre 2] Que faire lorsque vous faites une erreur dans le nom de la colonne
Tutoriel Rails Chapitre 3 Apprentissage
Mémorandum du didacticiel Rails (Chapitre 3, 3.1)
Tutoriel Rails Chapitre 4 Apprentissage
Tutoriel Rails Chapitre 1 Apprentissage
Tutoriel Rails Chapitre 2 Apprentissage
Comment afficher des graphiques dans Ruby on Rails (LazyHighChart)
Appliquer le CSS à une vue spécifique dans Ruby on Rails