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.
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 |
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.
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
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.
3,5 Stunden vom 18.10. Bis 22.10.
Recommended Posts