Ich habe versucht, eine Antwortfunktion für die Rails Tutorial-Erweiterung (Teil 3) zu erstellen: Ein Missverständnis der Spezifikationen wurde behoben

Dies ist eine Fortsetzung der Erstellung einer Antwortfunktion in Kapitel 14 des Rails-Lernprogramms.

Funktion zum Einfügen der ID in in_reply_to des Modells beim Posten

Wenn ein Micropost mit @reply geschrieben wird, eine Funktion zum Einfügen einer ID in in_reply_to des Modells machen.

Das einzige, was Sie ändern müssen, ist, die Post zu erhalten und das Modell zu speichern. Finden Sie heraus, wo es ist.

Durchsuchen Sie das Netz nach Methoden, die mit Zeichenfolgen arbeiten. https://www.sejuku.net/blog/11843 start_with? (Überprüfen Sie, ob es mit der angegebenen Zeichenfolge beginnt.) http://rubytips86.hatenablog.com/entry/2014/03/28/132953 Lesen.

Es stellt sich heraus, dass die Spezifikationen missverstanden werden

Als ich mich mit den Funktionen befasste, stellte ich fest, dass es ein Fehler war zu glauben, dass der Inhalt mit @reply begann. 「@reply exampleuser hogehoge...」 Ich dachte es wäre, aber es sollte richtig sein 「@exampleuser hogehoge...」 war.

Davon abgesehen, wenn der Name Leerzeichen enthält, wissen Sie, dass Sie ein Problem haben. Ich kam zum Beispiel auf die Idee, dass man nur den Namen "@Ola" finden kann, wenn der Name "Ola Lakin I" ist und man ihn als "@Ola Lakin I" postet.

Eine mögliche Lösung besteht darin, eine eindeutige ID hinzuzufügen. Eigentlich habe ich dasselbe im Text gesagt, aber zu diesem Zeitpunkt bekam ich endlich eine Prise.

Ich werde darüber nachdenken, wie das Folgende einzigartig gemacht werden kann, da der Text auch die spezifische Methode beschreibt. Wir gehen vorerst davon aus, dass @name ohne Leerzeichen eindeutig ist. Nachdem Sie das Feature unter dieser Annahme erstellt haben, werden wir einige einzigartige Änderungen vornehmen.

Extrahieren Sie Wörter, die mit @ beginnen, aus einer Zeichenfolge

Probieren Sie die Methode aus, die Sie im Internet auf der Konsole gesucht haben.

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

Finden Sie heraus, was passiert, wenn die Zeichenfolge kein @xx enthält.

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

Es wurde gleich Null.

Versuchen Sie als nächstes, das führende @ zu entfernen.

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

Jetzt können Sie das Wort @xxx abrufen.

Controller wechseln

Denken Sie, dass der Bildschirm nicht geändert werden muss, und sehen Sie sich den Text an, in dem der Controller geändert werden soll. Ich erstelle in controller / microposts_controller.rb.

controllers/microposts_controller.rb


  def create
    @micropost = current_user.microposts.build(micropost_params)
      #Auf Antwort prüfen
      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

Wo schreibe ich einen Test der Änderungen

Da wir den Controller wechseln werden, schreiben Sie zuerst den Test. Der Testpunkt ist, dass durch das Erstellen eines Antwort-Mikroposts die Anzahl der Empfänger um eins erhöht wird. Überlegen Sie, je nachdem, wo Sie den Test schreiben, wie Sie ihn vom Integrationstest trennen können.

Im Tutorial finden Sie ein Beispiel für einen Controller-Test. In den Mikroposts der Kapitel 13 und 14 wurde der Integrationstest nach dem Modelltest durchgeführt. In 13.3.1 bestand der Inhalt des Controller-Tests darin, zu testen, ob Sie angemeldet sind.

Schauen wir uns die Testquelle an. Unter dem Controller-Ordner. Beide waren Tests, um festzustellen, ob Sie angemeldet waren und die richtige Seite angezeigt haben. Wir haben festgestellt, dass der Integrationstest gut zur Überprüfung der verarbeiteten Ergebnisse geeignet ist.

Schreiben wir einen Integrationstest.

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

Fehler in den Gerätedaten

Als ich den Test durchführte, wurde ein Fehler mit den Gerätedaten angezeigt.

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'

Es sieht aus wie nicht gefunden. Wenn Sie im Internet nachsehen, hängt dies von der Reihenfolge ab, in der die Geräte aufgerufen werden, und davon, ob externe Einschränkungen bestehen Es scheint mühsam zu sein.

Versuchen Sie, im Test des Modells zu veröffentlichen, anstatt Testdaten mit Fixture zu erstellen.

Übrigens werde ich das Missverständnis der Spezifikation von @ reply korrigieren, als ich das Gerät zuvor gemacht habe.

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

Der Test ist jetzt bestanden.

Controller wechseln

Ändern Sie die Steuerung.

controllers/microposts_controller.rb


  def create
    @micropost = current_user.microposts.build(micropost_params)
      #Auf Antwort prüfen
      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

Korrigieren Sie die Testdaten

Korrigieren Sie die Testdaten. Erstellen Sie einen Benutzer ohne Leerzeichen zwischen Vor- und Nachname.

test/fixtures/users.yml


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

Fehler korrigieren

Der Test ist immer noch rot. Als ich mit Puts debuggte, habe ich einen Fehler gefunden und ihn behoben. Ich brauchte einen Ausweis.

Vor der Änderung @ micropost.in_reply_to = User.find_by (Name: reply_id) Nach der Änderung @ micropost.in_reply_to = User.find_by (Name: reply_id) .id

controllers/microposts_controller.rb


  def create
    @micropost = current_user.microposts.build(micropost_params)
      #Auf Antwort prüfen
      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

Der Test ist jetzt GRÜN.

Lassen Sie es uns auf dem Bildschirm testen. Ich habe einen Benutzer ohne Leerzeichen erstellt und bestätigt, dass es funktioniert.

Benötigte Zeit

2,5 Stunden vom 11.10. Bis 17.10.

Recommended Posts

Ich habe versucht, eine Antwortfunktion für die Rails Tutorial-Erweiterung (Teil 3) zu erstellen: Ein Missverständnis der Spezifikationen wurde behoben
Ich habe versucht, eine Nachrichtenfunktion der Rails Tutorial-Erweiterung (Teil 1) zu erstellen: Erstellen Sie ein Modell
Ich habe versucht, eine Nachrichtenfunktion für die Erweiterung Rails Tutorial (Teil 2) zu erstellen: Erstellen Sie einen Bildschirm zum Anzeigen
Ich habe eine Antwortfunktion für die Rails Tutorial-Erweiterung (Teil 1) erstellt.
Ich habe eine Antwortfunktion für die Rails Tutorial-Erweiterung (Teil 5) erstellt:
Ich habe eine Antwortfunktion für die Rails Tutorial-Erweiterung (Teil 2) erstellt: Modell ändern
Ich habe versucht, mit Rails eine Gruppenfunktion (Bulletin Board) zu erstellen
Ich habe eine Antwortfunktion für die Erweiterung Rails Tutorial (Teil 4) erstellt: Eine Funktion, die den Benutzer einzigartig macht
[Rails] Implementierung einer mehrschichtigen Kategoriefunktion unter Verwendung der Abstammung "Ich habe versucht, ein Fenster mit Bootstrap 3 zu erstellen"
Ich habe versucht, eine Anmeldefunktion mit Java zu erstellen
Ich habe einen RESAS-API-Client in Java erstellt
Ich habe eine App für maschinelles Lernen mit Dash (+ Docker) Teil 2 ~ Grundlegende Schreibweise für Dash ~ erstellt
Ich habe versucht, ein übergeordnetes Wertklasseobjekt in Ruby zu erstellen
Ich habe eine App für maschinelles Lernen mit Dash (+ Docker) Teil 3 ~ Übung ~ erstellt
Ich habe versucht, mit HCE-F von Android eine Funktion zu implementieren, die Felica Lite entspricht
Rails6 Ich möchte ein Array von Werten mit einem Kontrollkästchen erstellen
Ich möchte eine Funktion in der Rails Console definieren
Tutorial zum Erstellen eines Blogs mit Rails für Anfänger Teil 1
[Rails] Ich habe versucht, eine Mini-App mit FullCalendar zu erstellen
Ich möchte eine Produktinformationsbearbeitungsfunktion ~ part1 ~ implementieren
Ich möchte ein bestimmtes Modell von ActiveRecord ReadOnly erstellen
Ich habe versucht, die Beispielanwendung gemäß der Idee des Buches "Micro Service Architecture" in einen Mikrodienst zu verwandeln.
Ich möchte eine Funktion mit Kotlin und Java erstellen!
[Rails] Implementierung der Tutorial-Funktion
Tutorial zum Erstellen eines Blogs mit Rails für Anfänger Teil 2
Tutorial zum Erstellen eines Blogs mit Rails für Anfänger Teil 0
Ich möchte eine Browsing-Funktion mit Ruby on Rails hinzufügen
Ich habe versucht, die Bildvorschau mit Rails / jQuery zu implementieren
[Unity] Ich habe mit NWPathMonitor ein natives Plug-In UniNWPathMonitor erstellt
Ich habe versucht, eine einfache Anwendung mit Dockder + Rails Scaffold zu erstellen
[Java] Ich habe versucht, mit der Grabmethode ein Labyrinth zu erstellen ♪
Mit der Gesichtserkennungsfunktion von Watson Visual Recognition habe ich versucht, ein Ganzkörperbild einer Person in ein Bild nur des Gesichtsteils zu verarbeiten
Ich habe versucht, eine Anwendung für maschinelles Lernen mit Dash (+ Docker) Teil 1 ~ Umgebungskonstruktion und Funktionsprüfung ~ zu erstellen
Ich habe versucht, ein Beispielprogramm mit dem Problem des Datenbankspezialisten für domänengesteuertes Design zu erstellen
Ich habe versucht, eine einfache Gesichtserkennungs-Android-Anwendung mit OpenCV zu erstellen
[Rails] Ich möchte Daten verschiedener Modelle in einem Formular senden
[Rails] Ich habe versucht, eine Transaktion zu implementieren, die mehrere DB-Prozesse kombiniert
[iOS] Ich habe versucht, mit Swift eine insta-ähnliche Verarbeitungsanwendung zu erstellen
Ich habe versucht, eine Web-API zu erstellen, die mit Quarkus eine Verbindung zur Datenbank herstellt
Ich habe einen Arbitrage-Transaktionsbot für virtuelle Währungen erstellt und versucht, Geld zu verdienen
Ich habe versucht, den CPU-Kern mit Ruby voll auszunutzen
Ich habe versucht, mit AI "A3RT" eine Talk-App in Java zu erstellen.
Erstellen Sie trotzdem eine Anmeldefunktion mit Rails
Ich habe versucht, JavaScript Part.2 Objektorientiert zu berühren
[LINE @] Ich habe versucht, einen westlichen Kalender für einen japanischen Kalender zu konvertieren. BOT [Messaging API]
[Ruby on Rails] So machen Sie das Linkziel zu einem Teil der angegebenen ID
Ich habe versucht, verschiedene Programme wie Freundschaftsnummer, perfekte Nummer, überschüssige Nummer, Mangelzahl, Anzahl der Male zu machen
[Erste Umgebungskonstruktion] Ich habe versucht, eine Rails6 + MySQL8.0 + Docker-Umgebung unter Windows 10 zu erstellen.
Eine Geschichte, als ich versuchte, ein Video zu erstellen, indem ich Processing und Resolume verknüpfte
Was ich versucht habe, als ich alle Felder einer Bohne bekommen wollte
Ich habe versucht, mit Javafx ein einfaches Spiel zu machen ① "Lass uns Glücksspiel finden" (unvollendet)