J'ai essayé de faire une fonction de réponse de l'extension Rails Tutorial (Partie 3): Correction d'un malentendu des spécifications

Il s'agit d'une continuation de la création d'une fonction de réponse dans le chapitre 14 du didacticiel Rails.

Fonction pour mettre l'ID dans in_reply_to du modèle lors de la publication

Lorsqu'un micropost avec @reply écrit est posté, une fonction pour mettre un identifiant dans in_reply_to du modèle faire.

La seule chose à changer est de recevoir le message et de sauvegarder le modèle. Découvrez où il se trouve.

Recherchez sur le net des méthodes qui fonctionnent sur des chaînes. https://www.sejuku.net/blog/11843 start_with? (Vérifiez s'il commence par la chaîne de caractères spécifiée) http://rubytips86.hatenablog.com/entry/2014/03/28/132953 Lis.

Il s'avère que les spécifications sont mal comprises

En creusant dans les fonctionnalités, j'ai réalisé que c'était une erreur de penser que le contenu commençait par @reply. 「@reply exampleuser hogehoge...」 Je pensais que c'était, mais ça devrait être correct 「@exampleuser hogehoge...」 était.

Cela étant dit, si le nom contient des blancs, vous savez que vous avez un problème. Par exemple, j'ai eu l'idée que même si le nom est "Ola Lakin I" et que vous l'affichez comme "@Ola Lakin I", vous ne pouvez trouver que le nom "@Ola".

Une solution possible consiste à ajouter un identifiant unique. En fait, j'ai dit la même chose dans le texte, mais à ce stade, j'ai finalement eu une pincée.

Je vais réfléchir à la façon de rendre ce qui suit unique car le texte décrit également la méthode spécifique. Pour le moment, nous supposerons que @name est unique et n'inclut pas les espaces. Après avoir créé la fonctionnalité sur cette hypothèse, nous apporterons des modifications uniques.

Extraire les mots commençant par @ d'une chaîne

Essayez la méthode que vous avez recherchée sur le net sur la console.

>> s = "@Example hoge hoge aa"
=> "@Example hoge hoge aa"
>> b = s.scan(/@\w+/)
=> ["@Example"]

Découvrez ce qui se passe lorsque la chaîne ne contient pas @xx.

>> s2 = "Example hoge hoge aa"
=> "Example hoge hoge aa"
>> b2 = s2.scan(/@\w+/)                                                                                                                            
=> []
>> b2[0]
=> nil

C'est devenu nul.

Ensuite, essayez de supprimer le @.

>> b = s.scan(/@\w+/)
=> ["@Example"]
>> b[0].slice!(0)
=> "@"
>> b[0]
=> "Example"

Vous pouvez maintenant récupérer le mot @xxx.

Changer de contrôleur

Pensez que l'écran n'a pas besoin d'être changé et regardez le texte où changer le contrôleur. Je crée dans controllers / microposts_controller.rb.

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+/)
        @micropost.in_reply_to = reply_id[0].slice![0]
      end
    if @micropost.save
      flash[:succsess] = "Micropost created!"
      redirect_to root_url
    else
      @feed_items = []
      render 'static_pages/home'
    end
  end

Où écrire un test des changements

Puisque nous allons changer le contrôleur, écrivez d'abord test. L'élément de test est que la création d'un micro-message de réponse augmentera le nombre de destinataires d'un. En fonction de l'endroit où vous écrivez le test, réfléchissez à la façon de le séparer du test d'intégration.

Relisez le tutoriel pour un exemple de test de contrôleur. Dans les micro-messages des chapitres 13 et 14, le test d'intégration a été réalisé après le test du modèle. Dans 13.3.1, le contenu du test du contrôleur était de tester si vous êtes connecté.

Regardons en fait la source du test. Sous le dossier des contrôleurs. Les deux étaient des tests pour voir si vous étiez connecté et affichez la bonne page. Nous avons constaté que le test d'intégration était bon pour vérifier les résultats traités.

Écrivons un test d'intégration.

test/integration/reply_test.rb  RED


  test "reply to user " do
    log_in_as(@user)
    content = "@#{@other.name} reply test content"
    post microposts_path, params: { micropost: {content: content }}
    log_in_as(@other)
    get root_path
    assert_not @other.following?(@user)
    assert_match content, response.body
  end

Erreur dans les données de l'appareil

Lorsque j'ai exécuté le test, j'ai eu une erreur avec les données de l'appareil.

ERROR["test_reply_to_user_", ReplyTest, 0.3831760289999693]
 test_reply_to_user_#ReplyTest (0.38s)
NoMethodError:         NoMethodError: undefined method `id' for nil:NilClass
            test/fixtures/microposts.yml:54:in `get_binding'

Il semble introuvable. Si vous regardez sur le net, cela dépend de l'ordre dans lequel les appareils sont appelés, et s'il y a des restrictions externes Cela semble gênant.

Au lieu de créer des données de test avec un appareil, essayez de publier dans le test du modèle.

En passant, je corrigerai le malentendu de la spécification de @ reply lorsque j'ai fait le projecteur auparavant.

test/models/user_test.rb


  test "feed should have the reply posts" do
    michael = users(:michael)
    malory = users(:malory)
    assert_not malory.following?(michael)
    reply_post = michael.microposts.create!(content: "@malory reply test", 
                                            in_reply_to: malory.id)
    assert michael.feed.include?(reply_post)
    assert malory.feed.include?(reply_post)
  end

Le test est maintenant réussi.

Changer de contrôleur

Changez de contrôleur.

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(name: reply_id)
      end
    if @micropost.save
      flash[:succsess] = "Micropost created!"
      redirect_to root_url
    else
      @feed_items = []
      render 'static_pages/home'
    end
  end

Corriger les données de test

Corrigez les données de test. Créez un utilisateur sans espace entre le prénom et le nom.

test/fixtures/users.yml


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

Corriger les erreurs

Le test est toujours rouge, donc quand j'ai débogué avec des put, j'ai trouvé une erreur et je l'ai corrigée. J'avais besoin d'une pièce d'identité.

Avant modification @ micropost.in_reply_to = User.find_by (nom: reply_id) Après modification @ micropost.in_reply_to = User.find_by (nom: reply_id) .id

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(name: reply_id).id
      end
    if @micropost.save
      flash[:succsess] = "Micropost created!"
      redirect_to root_url
    else
      @feed_items = []
      render 'static_pages/home'
    end
  end

Le test est maintenant VERT.

Testons-le à l'écran. J'ai créé un utilisateur sans espace et j'ai confirmé que cela fonctionne.

Temps requis

2,5 heures du 10/11 au 10/17.

Recommended Posts

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
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 créer une fonction de groupe (babillard) avec Rails
J'ai créé une fonction de réponse pour l'extension Rails Tutorial (Partie 4): une fonction qui rend l'utilisateur unique
[Rails] Implémentation de la fonction de catégorie multicouche en utilisant l'ascendance "J'ai essayé de créer une fenêtre avec Bootstrap 3"
J'ai essayé de créer une fonction de connexion avec Java
J'ai créé un client RESAS-API en Java
J'ai créé une application d'apprentissage automatique avec Dash (+ Docker) part2 ~ Façon basique d'écrire Dash ~
J'ai essayé de créer une classe parent d'objet de valeur dans Ruby
J'ai créé une application d'apprentissage automatique avec Dash (+ Docker) part3 ~ Practice ~
J'ai essayé d'implémenter une fonction équivalente à Felica Lite avec HCE-F d'Android
Rails6 Je veux créer un tableau de valeurs avec une case à cocher
Je souhaite définir une fonction dans la console Rails
Tutoriel pour créer un blog avec Rails pour les débutants Partie 1
[Rails] J'ai essayé de créer une mini application avec FullCalendar
Je souhaite implémenter une fonction d'édition des informations produit ~ part1 ~
Je souhaite créer un modèle spécifique d'ActiveRecord ReadOnly
J'ai essayé de convertir l'exemple d'application en microservice selon l'idée du livre "Microservice Architecture".
Je veux créer une fonction avec kotlin et java!
[Rails] Implémentation de la fonction tutoriel
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
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
[Unity] J'ai essayé de créer un plug-in natif UniNWPathMonitor en utilisant NWPathMonitor
J'ai essayé de créer une application simple en utilisant Dockder + Rails Scaffold
[Java] J'ai essayé de faire un labyrinthe par la méthode de creusage ♪
En utilisant la fonction de détection de visage de Watson Visual Recognition, j'ai essayé de transformer une image corporelle entière d'une personne en une image de la partie du visage uniquement.
J'ai essayé de créer une application d'apprentissage automatique avec Dash (+ Docker) part1 ~ Construction de l'environnement et vérification du fonctionnement ~
J'ai essayé de créer un exemple de programme en utilisant le problème du spécialiste des bases de données dans la conception pilotée par domaine
J'ai essayé de créer une simple application Android de reconnaissance faciale en utilisant OpenCV
[Rails] Je souhaite envoyer des données de différents modèles dans un formulaire
[Rails] J'ai essayé d'implémenter une transaction qui combine plusieurs processus DB
[iOS] J'ai essayé de créer une application de traitement de type insta avec Swift
J'ai essayé de créer une API Web qui se connecte à DB avec Quarkus
J'ai créé un bot de transaction d'arbitrage de monnaie virtuelle et essayé de gagner de l'argent
J'ai essayé d'utiliser pleinement le cœur du processeur avec Ruby
J'ai essayé de créer une application de conversation en Java à l'aide de l'IA «A3RT»
Créez quand même une fonction de connexion avec Rails
J'ai essayé de toucher JavaScript Part.2 orienté objet
[LINE @] J'ai essayé de créer un BOT de conversion de calendrier occidental de calendrier japonais [API de messagerie]
[Ruby on Rails] Comment faire de la destination du lien une partie de l'ID spécifié
J'ai essayé de faire divers programmes de nombre d'amitié, nombre parfait, nombre excessif, nombre de pénurie, nombre de fois
[Première construction d'environnement] J'ai essayé de créer un environnement Rails6 + MySQL8.0 + Docker sur Windows 10.
Une histoire où j'ai essayé de faire une vidéo en liant Traitement et Resolume
Ce que j'ai essayé quand je voulais obtenir tous les champs d'un haricot
J'ai essayé de faire un jeu simple avec Javafx ① "Trouvons le jeu du bonheur" (inachevé)