Ich habe eine Antwortfunktion für die Erweiterung Rails Tutorial (Teil 4) erstellt: Eine Funktion, die den Benutzer einzigartig macht

Dies ist eine Fortsetzung der Erstellung einer Antwortfunktion in Kapitel 14 des Rails-Lernprogramms. Bis zum letzten Mal konnte ich die Antwort eingeben und anzeigen. Erstellen Sie als Nächstes einen Ort, um den Benutzer eindeutig zu machen.

Fähigkeit, Benutzer einzigartig zu machen

Modellwechsel Design

Tipps im Tutorial

Fügen Sie dem Benutzerregistrierungsfeld einen eindeutigen Benutzernamen hinzu, damit er mit @reply verwendet werden kann.

Aufgrund der obigen Ausführungen habe ich beschlossen, dem Modell eine Spalte hinzuzufügen.

Im Tutorial finden Sie eine Möglichkeit, Spalten auf die gleiche Weise hinzuzufügen.

In Kapitel 9 haben wir dem Benutzermodell Spalten hinzugefügt. Stellen Sie für alle Fälle sicher, dass es im Vergleich zur Quelle auf dem neuesten Stand ist. sample_app / db / schema.rb Admin und reset_sent_at sind sehr unterschiedlich. Es gab auch einige in den Ordnern unter migrieren. Versuchen Sie, am Ende des Textes nach "Migräne" zu suchen. Dann wurde ich in Kapitel 12 erwischt. Ich habe in Listing 12.6 eine Spalte hinzugefügt. Abbildung 12.5 war die neueste.

Stellen Sie das Bild dar, zu dem Sie eine Spalte hinzufügen möchten, ähnlich wie im Lernprogramm.

Spaltenname Attribut
id integer
name string
email string
.. ..
reset_sent_at datetime
unique_name string

Zahl. Benutzermodell mit eindeutig benannten Spalten

Suchen Sie im Lernprogramm den Ort, an dem Sie den eindeutigen Index erstellt haben. Versuchen Sie, nach "Index" zu suchen. Dann wurde ich in Kapitel 6 erwischt. Ich habe meiner E-Mail-Adresse in Listing 6.29 einen Index hinzugefügt.

Codierung des Modellwechsels

Fügen Sie dem Modell eine Spalte hinzu.

ubuntu:~/environment/sample_app (reply-micropost) $ rails generate migration add_unique_name_to_users unique_name:string
Running via Spring preloader in process 2911
      invoke  active_record
      create    db/migrate/20201018232033_add_unique_name_to_users.rb

Geben Sie die Zeile ein, um den Index von Hand zu erstellen, siehe Listing 6.29.

db/migrate/20201018232033_add_unique_name_to_users.rb


class AddUniqueNameToUsers < ActiveRecord::Migration[5.1]
  def change
    add_column :users, :unique_name, :string
    add_index :users, :unique_name, unique: true
  end
end

Nehmen Sie Änderungen an der Datenbank vor.

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

Modellwechsel-Test

Erstellen Sie einen Test mit einem eindeutigen Namen. Es könnte besser gewesen sein, es zuerst zu machen. Fügen Sie den Test zu user_test.rb hinzu.

test/models/user_test.rb green


  def setup
    @user = User.new(name: "Example User", email: "[email protected]",
                     password: "foobar", password_confirmation: "foobar",
                     unique_name: "Example")
  end

test/models/user_test.rb red


   test "unique_name should be present" do
    @user.unique_name = "    "
    assert_not @user.valid?
  end

Erstellen Sie einen Test ähnlich wie E-Mail. Ich machte einen Test und stellte fest, dass es einzigartig war, aber Leerzeichen erlaubte.

Die Funktion zum Verhindern von Leerzeichen wurde ebenfalls in der E-Mail-Spalte erstellt. Suchen Sie sie daher im Lernprogramm. Es war in Listing 6.9. Auf die gleiche Weise hinzufügen.

app/models/user.rb


  validates :password, presence: true, length: {minimum: 6}, allow_nil: true
  validates :unique_name, presence: true, length: {maximum: 50}, uniqueness: true

Ich konnte testen, dass es einzigartig war und keine Leerzeichen zuließ.

test/models/user_test.rb green


  test "unique_name shuould be unique" do
    duplicate_user = @user.dup
    duplicate_user.email = @user.email.upcase + "aa"
    @user.save
    assert_not duplicate_user.valid? 
  end

Lassen Sie uns die Testdaten auf der Konsole überprüfen.

>> user = User.first
>> user.valid?
=> false
>> user.errors.full_messages
=> ["Unique name can't be blank", "Unique name has already been taken"]

Die zweite Person ist dieselbe. Ändern Sie daher die Testdaten. Ändern Sie es so, dass es einen eindeutigen Namen enthält. Ich werde den Vornamen-Teil des Vor- und Nachnamens aus dem Namen und den Vornamen auf Englisch herausnehmen und ihn in unique_name setzen.

db/seeds.rb


99.times do |n|
  name  = Faker::Name.name
  email = "example-#{n+1}@railstutorial.org"
  password = "password"
  unique_name = name.split(' ')[0]
  User.create!( name: name,
                email: email,
                password:              password,
                password_confirmation: password,
                activated: true,
                activated_at: Time.zone.now,
                unique_name: unique_name)
end

Stellen Sie die Daten wieder in die Datenbank.

$ rails db:migrate:reset
ubuntu:~/environment/sample_app (reply-micropost) $ rails db:seed
rails aborted!
ActiveRecord::RecordInvalid: Validation failed: Unique name has already been taken
/home/ubuntu/.rvm/gems/ruby-2.6.3/gems/activerecord-5.1.6/lib/active_record/validations.rb:78:in `raise_validation_error'

Ich habe einen Fehler bekommen. Mal sehen, wie viele Daten auf der Konsole eingegeben wurden.

> User.count
   (0.2ms)  SELECT COUNT(*) FROM "users"
=> 14

Es sollten 100 sein, aber nur 14 sind enthalten. Die Fehlermeldung lautet "Eindeutiger Name wurde bereits vergeben", daher vermute ich, dass der eindeutige Name doppelt vorhanden ist. Probieren Sie es auf der Konsole aus, um zu sehen, warum es sich überschneidet.

ubuntu:~/environment/sample_app (reply-micropost) $ rails console
>> 99.times do |n|
?> name = Faker::Name.name
>> puts name.split(' ')[0].split(' ')[0]
>> end
Mr.
Forest
Araceli
Mrs.
Cody
Mr.

Ich trat darauf, dass ich den Vornamen abrufen konnte, aber das erste Wort des Namens war MR. MR. Scheint verschiedene Variationen wie Frau zu haben, und ich denke, es ist schwierig, es mit einfacher Logik einzigartig zu machen, deshalb werde ich es aufgeben, es herauszunehmen. Ändern Sie den Namen und den eindeutigen Namen als irrelevante Werte.

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
  User.create!( name: name,
                email: email,
                password:              password,
                password_confirmation: password,
                activated: true,
                activated_at: Time.zone.now,
                unique_name: unique_name)
end

Stellen Sie die Daten wieder in die Datenbank. Da die Daten bereits enthalten sind, initialisieren Sie sie zu diesem Zeitpunkt einmal.

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

Es ist kein Fehler aufgetreten. Schauen wir uns die Daten auf der Konsole an, um festzustellen, ob sie eingegeben wurden.

>> User.last
  User Load (0.2ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT ?  [["LIMIT", 1]]
=> #<User id: 100, name: "Cassandre Cummerata", email: "[email protected]", created_at: "2020-10-21 23:25:17", updated_at: "2020-10-21 23:25:17", password_digest: "$2a$10$5/ddAbowTuZim/atIYzia.jYf5omGvECsfm0AX78v3i...", remember_digest: nil, admin: false, activation_digest: "$2a$10$wMZu8WO6BCWrvYY.oPjMReGiXs0nqJ0TuyA3OZ4QWhu...", activated: true, activated_at: "2020-10-21 23:25:17", reset_digest: nil, reset_sent_at: nil, unique_name: "Julia">

eindeutiger_name wurde gesetzt.

Benötigte Zeit

3,5 Stunden vom 18.10. Bis 22.10.

Recommended Posts

Ich habe eine Antwortfunktion für die Erweiterung Rails Tutorial (Teil 4) erstellt: Eine Funktion, die den Benutzer einzigartig macht
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, 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
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 0
Ich habe eine GitHub-Aktion erstellt, die es einfach macht, das Ausführungsergebnis von RSpec zu verstehen
Ich habe eine einfache Empfehlungsfunktion erstellt.
Ich habe versucht, die Funktion zum Hochladen mehrerer Bilder in Rails zu implementieren, damit mehrere Bilder für den Beitrag verschoben werden können
Ich habe ein Plug-In für IntelliJ IDEA erstellt
Einführung des Spring Boot Actuator, einer Funktion, die die Bedienung von Spring Boot-Anwendungen erleichtert
Ich habe einen THETA API-Client erstellt, der für die Plug-Entwicklung verwendet werden kann
Ich suchte nach einem leichten Framework, das das plötzliche "schnell machen" beantworten würde.
[Ein Muss für junge Ingenieure] Eine Geschichte, die die Welt erweitert hat, als ich tatsächlich einen Webdienst betrieben habe, den ich selbst erstellt habe
Ich habe ein Diff-Tool für Java-Dateien erstellt
Verwenden Sie [Rails], um eine Gastbenutzerfunktion zu entwickeln (für das Portfolio).
Ich habe eine Viewer-App erstellt, die PDF anzeigt
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 einen Testcode (Junit & mockit) für den Code geschrieben, der die AWS-API (Java) aufruft.
Als ich einem Benutzer meine Seite erstellte, wurde die Benutzerbearbeitungsfunktion von devise seltsam.
Ich habe eine Funktion zum Registrieren von Bildern bei der API in Spring Framework erstellt. Teil 1 (API Edition)