Dies ist eine Fortsetzung der Erstellung einer Antwortfunktion in Kapitel 14 des Rails-Lernprogramms.
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.
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.
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.
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
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
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.
Ä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. 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 %>
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.
2,5 Stunden vom 11.10. Bis 17.10.