Wenn ich mich mit Devise in Rails als Benutzer registriere, denke ich, dass es Zeiten gibt, in denen ich die Attribute durch Parameter teilen möchte, während ich dasselbe Modell verwende, aber überraschenderweise gibt es keinen Artikel, der dies sagt, also werde ich ihn als Artikel schreiben. Es wird davon ausgegangen, dass zusätzlich zu den neuen Registrierungs- und Anmeldelinks ein Registrierungslink für andere Attribute vorhanden ist (siehe hier für die Registrierung der Premium-Mitgliedschaft). Wir möchten dies in Attribute unterteilen, indem wir Parameter wie Boolean angeben und dabei die Ansicht und den Controller mit einem Benutzermodell wiederverwenden. Ich wäre Ihnen dankbar, wenn Sie auf Fehler hinweisen könnten.
console
Windows10
ruby 2.6.6
Rails 6.0.3.1
psql (PostgreSQL) 12.3
Fügen Sie zunächst eine Spalte hinzu, um das vorhandene Benutzermodell zuzuordnen (diesmal ist es isPremium: boolean). Das Hinzufügen dieser Spalte ist auch für Anfänger ziemlich mysteriös, und ich war mir zunächst nicht sicher und habe versucht, sie der vorhandenen Migrationsdatei hinzuzufügen, aber anscheinend wurde die Migrationsdatei, die beim ersten Rails db: migrate verwendet wurde, danach gelesen. Abwesend? Es scheint. Erstellen Sie also eine weitere Migrationsdatei und schreiben Sie eine Methode, um Spalten hinzuzufügen.
console
rails g migration AddCulumnToTable
Der Teil von AddCulmnToTable ist ein beliebiger Klassenname, aber normalerweise scheint etwas, das später leicht zu verstehen ist, wie z. B. Hinzufügen + Spaltenname zum hinzuzufügenden Tabellennamen, gut zu sein.
Fügen Sie der zuvor erstellten Migrationsdatei Folgendes hinzu.
2020~~_add_column_to_table.rb
def change
add_column :users, :isPremium, :boolean #hinzufügen
change_column_null :users, :isPremium, false, false #hinzufügen
change_column_default :users, :isPremium, from: nil, to: false #hinzufügen
end
Im Teil "add_column: users ,: isPremium ,: boolean" wird der Benutzertabelle eine Spalte mit dem Namen isPremium vom Typ boolean hinzugefügt. Null wird durch "change_column_null: users ,: isPremium, false, false" verboten. Der vorhandene Benutzer verfügt jedoch nicht über eine isPremium-Spalte (null). Setzen Sie sie daher ebenfalls auf false. "Change_column_default: users ,: isPremium, from: nil, to: false" legt den Standardwert fest. Wenn add_column fertig ist, ist der Standardwert "Null" und wird daher in "false" geändert.
console
rails db:migrate
Die Datenbank sollte basierend auf der von Ihnen erstellten Migrationsdatei aktualisiert werden.
In Devise können Sie standardmäßig E-Mail und Kennwort festlegen. Wenn Sie jedoch andere Spalten hinzufügen, legen Sie so genannte starke Parameter fest (Benutzername, diesmal isPremium usw.).
application_controller.rb
before_action :configure_permitted_parameters, if: :devise_controller?
private
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys:[:username, :isPremium])
end
Jetzt können Sie die Spalten Benutzername und isPremium zum Zeitpunkt der neuen Registrierung registrieren.
Auf diese Weise ist es möglich, das isPremium des Benutzermodells manuell zu wechseln und es in Attribute zu unterteilen (z. B. ein Kontrollkästchen zum Zeitpunkt der Registrierung bereitzustellen?). Dieses Mal werde ich jedoch versuchen, es zu einem Mechanismus zu machen, der automatisch per Link wechselt. Erstellen Sie also den Controller und leiten Sie ihn weiter (überspringen Sie, wenn Sie bereits fertig sind).
console
rails g devise:controllers users
config/routes.rb
devise_for :users,
controllers: {
registrations: 'users/registrations'
}
Fügen Sie danach den Link ein, wo immer Sie möchten (diesmal ist es home / index). Zu diesem Zeitpunkt werde ich es ermöglichen, Parameter zu übergeben und die Attribute zu teilen.
erb:home/index.html.erb
<%= link_to "Einloggen", new_user_session_path %>
<%= link_to "Mitgliedsregistrierung", new_user_registration_path(premium: "false") %>
Registrierung der Premium-Mitgliedschaft<%= link_to "Hier", new_user_registration_path(premium: "true") %>
Sowohl die Registrierung der Mitgliedschaft als auch die Registrierung der Premium-Mitgliedschaft haben denselben "new_user_registration_path", aber wir übergeben eine Variable namens "Premium", um sie zu unterscheiden.
In "new_user_registration_path" sollte die neue Aktion von RegistrationsController von zuvor erstellten Benutzern aufgerufen werden, damit ich sie schreiben kann.
users/registrations_controller.rb
# GET /resource/sign_up
def new
@premium = params[:premium] #hinzufügen
super
end
Kommentieren Sie die neue Aktion (#) aus und geben Sie die Prämie, die Sie gerade übergeben haben, in @premium ein. (Hier habe ich nach super @premium = params [: premium] geschrieben und war eine Stunde lang süchtig danach.)
Da es nicht erforderlich ist, es in der Ansicht anzuzeigen, verwenden Sie f.hidden_field usw. (andere Formulare werden weggelassen).
erb:registrations/new.html.erb
<%= f.hidden_field :isPremium, :value => @premium %>
Wenn Sie dies an einer geeigneten Stelle im Formular schreiben, wird das über den Link übergebene @premium in der Spalte isPremium des Benutzermodells registriert.
Ich habe es vorerst geschafft, aber ich habe nicht das Gefühl, einen Umweg zu machen. Danach war ich besorgt, weil ich wenig Verständnis für Rails hatte und mit der neuen Aktion der Registrierungen zuerst super anrief. Bitte lassen Sie mich wissen, ob es einen intelligenteren Weg gibt!
Recommended Posts