Ich habe eine Antwortfunktion für die Rails Tutorial-Erweiterung (Teil 5) erstellt:

Dies ist eine Fortsetzung der Erstellung einer Antwortfunktion in Kapitel 14 des Rails-Lernprogramms. Bis zum letzten Mal haben wir ein Modell erstellt und getestet, das den Benutzer einzigartig macht. Fügen Sie als Nächstes Funktionen zu Benutzeraktualisierungen / -änderungen hinzu.

Überprüfen von Änderungen in der Benutzeransicht

Überlegen Sie, wo und wie Sie unique_name hinzufügen. Lesen Sie Kapitel 7 des Tutorials zurück. 7.1 Benutzer anzeigen Fügen Sie den anzuzeigenden Elementen einen eindeutigen Namen hinzu 7.2 Benutzerregistrierungsformular Fügen Sie den einzugebenden Elementen einen eindeutigen Namen hinzu 7.3 Fehler bei der Benutzerregistrierung Zur Fehlermeldung hinzugefügt, zum Test hinzugefügt 7.4 Erfolgreiche Benutzerregistrierung wurde dem Test hinzugefügt, wenn er erfolgreich war

Lesen Sie zurück Kapitel 10 Benutzer aktualisieren / anzeigen / löschen. 10.1 Benutzer aktualisieren Fügen Sie den Eingabeelementen einen eindeutigen Namen hinzu 10.3 Alle Benutzer anzeigen Den angezeigten Elementen wurde ein eindeutiger Name hinzugefügt

Ich denke, das deckt es ab.

Benutzeransicht ändern

7.1 Ändern Sie die Ansicht des Benutzers. Auf dem Bildschirm setzen wir am Anfang ein @, um dies als eindeutigen Namen zu identifizieren.

ruby:views/users/show.html.erb


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

7.2 Zum Benutzerregistrierungsformular hinzufügen. Als ich nach welcher Datei gesucht und new.html.erb angesehen habe, stand render'form '. Ich wusste, ich sollte es dem Formular hinzufügen.

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' %>

Schauen Sie sich als nächstes den Konturierer an.

Ich habe mir 7.3.2 Starke Parameter angesehen und herausgefunden, wo ich sie hinzufügen kann.

controllers/users_controller.rb


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

7.3.3 Lesen Sie die Fehlermeldung zurück. Für die Fehlermeldung in Abbildung 7.18 wissen wir, dass unique_name auch einen Fehler ausgeben sollte. Unique name can't be blank Unique name has already been taken

Benutzerregistrierungstest

Listing 7.23: Fügen Sie Tests sowie Tests für ungültige Benutzerregistrierungen hinzu.

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>'

Bevor ich es hinzufügte, habe ich versucht, den Test auszuführen, und es stellte sich heraus, dass er ROT war. Ich dachte, dass das Hinzufügen eines Benutzers ein Fehler ist, da der Test, der normal registriert wurde, keinen eindeutigen Namen im Test test_valid_signup_information_with_account_activation enthält. Fügen Sie einen eindeutigen Namen hinzu.

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

Da der Test erfolgreich war, habe ich beschlossen, den Server zu starten und den Benutzer vom Bildschirm aus zu registrieren.

Füllen Sie zunächst die Datenbank neu, um die Benutzer zu entfernen, die Sie im Test eingegeben haben.

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

Ich habe auch einen doppelten Fehler erhalten. Als ich als Debug versuchte, unique_name mit Puts auszugeben, wurde Jeramy zweimal ausgegeben. Faker glaubt, dass der Vorname allein nicht eindeutig ist, und beschließt daher, nach dem Vornamen eine Nummer hinzuzufügen.

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}"

Es ging gut. Schauen wir uns einige Daten in der Konsole an.

>> 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">

Als ich den Server startete und den Benutzer über den Bildschirm registrierte, konnte ich mich erfolgreich registrieren. input_form.png show.png

Benutzeraktualisierungstest

Lesen Sie 10.1 "Benutzer aktualisieren" im Tutorial. Als ich versuchte, den Benutzer über den Bildschirm zu aktualisieren, gab es keinen Fehler und das Update war erfolgreich.

Der Test ist wahrscheinlich ROT wie bei der Registrierung, also werde ich es versuchen.

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>'

Als ich über die Ursache nachdachte, bemerkte ich, dass ich dem Fixture-Benutzer keinen eindeutigen Namen hinzugefügt habe.

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

Fügen Sie dem Test auch die Änderung des eindeutigen Namens für erfolgreiche Änderungen hinzu.

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} }

Fügen Sie dem Fehlertest auch die Änderung des eindeutigen Namens hinzu.

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>'

Da der Fehler von unique_name um eins erhöht wird, wurde er wie erwartet ROT. Als ich die Anzahl der Fehler von 4 auf 5 erhöhte, wurde es GRÜN.

test/integration/users_edit_test.rb GREEN


  test "unsuccessful edit" do

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

Benutzerlistentest

10.3 Lesen Sie "Alle Benutzer anzeigen". Zeigen Sie den eindeutigen Namen neben dem Namen an.

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


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

Ich habe den Indextest durchgeführt und er war GRÜN. test/integration/users_index_test.rb

Alle Tests

Versuchen Sie, alle Tests auszuführen.

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.

Beim Profiltest ist ein Fehler aufgetreten. Die h1-Zeichenfolge ist nicht "genau übereinstimmender Name". Wechseln Sie zu "Name einschließen". Ich habe im Internet gesucht und festgestellt, dass reguläre Ausdrücke zum Durchsetzen verwendet werden können. https://zariganitosh.hatenablog.jp/entry/20080405/1207455670

assert_select "title", /Welcome/ #Erfolgreich, wenn die Titel-Tag-Zeichenfolge "Willkommen" enthält.

Lesen Sie den Artikel und ändern Sie ihn.

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}/ 

Ändern Sie den Ort, an dem der Name als Antwort verwendet wurde, in den eindeutigen Namen.

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(unique_name: reply_id).id
      end

Prüfung

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>'

Ich habe mich gefragt, ob der Test zu einem Fehler führen würde, der dadurch verursacht wird, dass der Name für die Antwort verwendet und noch nicht geändert wird, aber ich habe einen anderen Fehler erhalten. Die Nachricht besagt, dass User.find_by (eindeutiger_name: reply_id) null ist. Ich denke, das liegt daran, dass find_by nicht gefunden wird. Debuggen mit Puts.

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)
        puts (User.find_by(unique_name: reply_id) == nil) 

Da die Ausgabe von Puts wahr war, ändern Sie den Controller so, dass er im Fall von Nicht gefunden nichts tut.

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)
        if reply_user = User.find_by(unique_name: reply_id)  
          @micropost.in_reply_to = reply_user.id
        end
      end

Als ich es getestet habe, ist der vorherige Fehler verschwunden und ich habe einen weiteren Fehler erhalten.

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 

Der Fehler ist, dass der Beitrag der Antwort nicht im Feed angezeigt wird.

Mir wurde klar, dass ich die im Test veröffentlichte Antwort nicht von name in unique_name geändert habe. Als ich es änderte, wurde es GRÜN.

test/integration/reply_test.rb GREEN


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

Test vom Bildschirm

Starten Sie den Server und testen Sie ihn vom Bildschirm aus. unique_error.png Zahl. Testen auf eindeutige Benutzerduplizierung

index.png Zahl. Liste der Benutzer @ unique_user wurde hinzugefügt

Ich werde versuchen, eine Antwort einzugeben. Absender: @Beispiel Empfänger: @testb

reply_test1.png Zahl. Antwort eingeben

Der Antwortbeitrag wird auf dem Startbildschirm des Absenders angezeigt. reply_test2.png Zahl. Wird dem Absender der Antwort angezeigt

Melden Sie sich erneut als Empfänger der Antwort an und zeigen Sie den Startbildschirm an. Der Antwortbeitrag wird angezeigt. reply_test3.png Zahl. Die Antwort wird auf dem Startbildschirm des Empfängers der Antwort angezeigt

Der Antwortbeitrag wird nicht auf dem Anzeigebildschirm des Empfängers angezeigt. reply_test4.png Zahl. Die Antwort wird auf dem Anzeigebildschirm des Empfängers der Antwort ausgeblendet

Überprüfen Sie die Spezifikationen des Anzeigebildschirms

Die Antwort wird nicht auf dem Anzeigebildschirm des Empfängers angezeigt. Überlegen Sie, warum und ob Sie die Feed-Methode nicht verwenden.

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

Ich habe die Feed-Methode nicht verwendet. Überlegen Sie, ob diese Spezifikation Ihren Anforderungen entspricht. Der Punkt ist, dass Show von Personen verwendet werden kann, die nicht angemeldet sind.

Rückblickend, als ich mich für die Anforderungen entschieden habe,

・ Wenn ein Drittanbieter den Feed-Bildschirm des Empfängers anzeigt, wird keine Antwort angezeigt.

Ich hatte die Anforderungen entschieden. Also stellte ich fest, dass es kein Problem gab.

Überprüfen Sie dann die Anforderungen, um festzustellen, ob sie für die Follower sichtbar sein sollen. Rückblickend, als ich mich für die Anforderungen entschieden habe,

Die Follower des Antwortsenders sind sichtbar. Die Follower des Antwortempfängers sind nicht sichtbar.

war. Es scheint im folgenden Test bestätigt zu werden, also bestätigen Sie es.

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

Ich konnte es bestätigen, weil ich Feed verwendet habe.

Überprüfen Sie tatsächlich auf dem Bildschirm. Finden Sie @ Beispiel-Follower als Absender-Follower. Mit Blick auf Samen folgen Benutzer [3..40]. Melden Sie sich mit einem von ihnen an. name:Gladys Kuhlman  email:[email protected] Die Antwort wurde angezeigt.

Überprüfen Sie den Bildschirm der Follower des Empfängers der Antwort. Es gab keine Anhänger von @testb. Es ist Benutzer [2], der dem Absender nicht folgt. name:Horacio Kautzer email:[email protected] Einloggen mit. Folgen Sie @testb vom Bildschirm. Ich kehrte zum Startbildschirm zurück und da die Antwort nicht angezeigt wurde, konnte ich bestätigen, dass der Vorgang korrekt war.

Ich bemerkte, dass die alte Spezifikation @ in Samen geschrieben war und korrigierte sie. Es ist nur ein kosmetisches Problem, daher hat es keinen Einfluss auf den Test, aber ich mag es nicht, wenn ich es später nicht verstehe, also habe ich es behoben.

/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)

Damit ist die Antwortfunktion abgeschlossen.

Benötigte Zeit

5,5 Stunden vom 23.10. Bis 26.10. In der gesamten Antwortfunktion 9 / 27-10 / 26 beträgt der Arbeitstag 29 Tage, insgesamt 22 Stunden.

Recommended Posts

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 eine Antwortfunktion für die Erweiterung Rails Tutorial (Teil 4) erstellt: Eine Funktion, die den Benutzer einzigartig macht
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
[Rails] Ich habe eine Entwurfsfunktion mit enum erstellt
Ich habe ein Check-Tool für das Release-Modul erstellt
Tutorial zum Erstellen eines Blogs mit Rails für Anfänger Teil 1
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 habe eine einfache Empfehlungsfunktion erstellt.
Ich habe ein Plug-In für IntelliJ IDEA erstellt
Ich habe eine Ruby-Erweiterungsbibliothek in C erstellt
Ich habe einen LINE Bot mit Rails + Heroku gemacht
Ich habe mit Ruby On Rails ein Portfolio erstellt
Ich habe ein Docker-Image für die japanische Version von SDAPS erstellt
Ich habe eine Methode entwickelt, um nach Premium Friday zu fragen
Ein Hinweis zum Initialisieren von Feldern im Java-Lernprogramm
Was soll ich für das Test-Framework verwenden [Rails]
Ich möchte eine Funktion in der Rails Console definieren
Ich habe eine Bibliothek zum Anzeigen von Tutorials auf Android erstellt.
Ich habe eine Funktion zum Registrieren von Bildern bei der API in Spring Framework erstellt. Teil 1 (API Edition)
Ich möchte der Kommentarfunktion eine Löschfunktion hinzufügen
Ich habe eine Funktion zum Registrieren von Bildern bei der API in Spring Framework erstellt. Teil 2 (Client Edition)
Ich habe versucht, eine japanische Version der Automatik-Mail von Rails / devise zu erstellen
Ich habe eine Entwicklungsumgebung mit Rails6 + Docker + PostgreSQL + Materialise erstellt.
[Rails] Ich habe zum ersten Mal versucht, die button_to-Methode zu verwenden
Ich möchte eine Produktinformationsbearbeitungsfunktion ~ part1 ~ implementieren
Ein Hinweis zum Seed-Feature von Ruby on Rails
Ich habe JAX-RS ausprobiert und mir das Verfahren notiert
Ich möchte ein Formular erstellen, um die Kategorie [Schienen] auszuwählen
Erstmaliges Modellieren von Digimon mit DDD Teil 1
Schienen ~ Die Nachrichtenfunktion verstehen ~
[Rails] Implementierung der Tutorial-Funktion
Als ich mit MPAndroidChart ein Balkendiagramm erstellt habe, war die Beschriftung der x-Achse aus irgendeinem Grund falsch ausgerichtet
Ein halbes Jahr Selbststudium unerfahren gemacht SPA mit Rails + Nuxt.js, also schauen Sie bitte
[Rails] Ich habe eine einfache Kalender-Mini-App mit benutzerdefinierten Spezifikationen erstellt.
Implementieren Sie eine verfeinerte Suchfunktion für mehrere Modelle ohne Rails5-Juwel.
Ich möchte eine Browsing-Funktion mit Ruby on Rails hinzufügen
Ich habe versucht, die Bildvorschau mit Rails / jQuery zu implementieren
Ich habe kürzlich eine JS-App in der gemunkelten Dart-Sprache erstellt
Ich habe ein Juwel gemacht, um den Text des Org-Modus in Qiita zu posten
Erstellt eine Methode zum Anfordern von Premium Friday (Java 8-Version)
Ich habe ein Tool erstellt, um den Unterschied zwischen CSV-Dateien auszugeben
[Selbststudium] Erstellen eines Portfolios (Original-App) nach Abschluss des Rails-Tutorials