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.
Ü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.
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
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.
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
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
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"
Starten Sie den Server und testen Sie ihn vom Bildschirm aus. Zahl. Testen auf eindeutige Benutzerduplizierung
Zahl. Liste der Benutzer @ unique_user wurde hinzugefügt
Ich werde versuchen, eine Antwort einzugeben. Absender: @Beispiel Empfänger: @testb
Zahl. Antwort eingeben
Der Antwortbeitrag wird auf dem Startbildschirm des Absenders angezeigt. 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. Zahl. Die Antwort wird auf dem Startbildschirm des Empfängers der Antwort angezeigt
Der Antwortbeitrag wird nicht auf dem Anzeigebildschirm des Empfängers angezeigt. Zahl. Die Antwort wird auf dem Anzeigebildschirm des Empfängers der Antwort ausgeblendet
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.
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