[RUBY] [Rails] Registrieren Sie sich mit Devise nach Attributen desselben Modells

Einführung

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.

Umgebung

console


Windows10
ruby 2.6.6
Rails 6.0.3.1
psql (PostgreSQL) 12.3

Fügen Sie eine Spalte hinzu

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.

Bearbeiten Sie die Migrationsdatei

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.

Reflektiert in der Datenbank

console


rails db:migrate

Die Datenbank sollte basierend auf der von Ihnen erstellten Migrationsdatei aktualisiert werden.

Starke Parameter einstellen

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.

Einstellungen rund um den Controller

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'
  }

Erstellen Sie einen Link

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.

Empfangen Sie Variablen auf dem Controller

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.)

Pass to View

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.

Ende

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

[Rails] Registrieren Sie sich mit Devise nach Attributen desselben Modells
Versuchen Sie es mit dem Ruby on Rails-Abfrageattribut
[Enum] Verwenden Sie Rails Enum, um die Lesbarkeit von Daten zu verbessern
Eine Überprüfung des von Rails-Anfängern verwendeten Codes
[Rails] Standardmäßig festgelegte Kennwortüberprüfung abbrechen / ändern
Rails6: Geben Sie die Anfangsdaten von ActionText mit seed ein
[Rails] Verwenden Sie das Pulldown-Feld, um die Post-Liste nach Datum oder Anzahl der Likes zu sortieren.
[Rails] Einführung in die Grundlagen der Entwicklung
Bei Verwendung des Konstruktors der Date-Klasse von Java wird das Datum um 1900 vorverlegt.
[Schienen] Wenn die Layoutänderung des Geräts nicht berücksichtigt wird
[Rails] So zeigen Sie eine Liste der Beiträge nach Kategorie an
Erweiterung des 4-Tier-Modells der von Eric Evans befürworteten Architektur
[Rails] So konvertieren Sie den URI des von http gesendeten Bildes in https, wenn Sie die Twitter-API verwenden
[Rails] Unterdrücken Sie nutzloses SQL, indem Sie die Cache-Steuerung von Zuordnungen verwenden
Ersetzen Sie die Vorschau durch Hochladen, indem Sie auf das Bild in file_field of Rails klicken
Das Problem, dass das Attribut des Benutzermodells in ActionMailer gleich Null wird
[Schienen] Änderungen der von devise erstellten Ansichtsseite werden nicht berücksichtigt
[Rails 5] Anzeigen des Bildschirms zum Ändern des Kennworts bei Verwendung von devise
[Rails] Einführung von Rubocop durch Anfänger
[Schienen] Überprüfen Sie den Inhalt des Objekts
Erläuterung der Reihenfolge der Schienenrouten
Überprüfen Sie den Migrationsstatus von Schienen
[Schienen 6] zerstören mit der Ressourcenmethode
[Rails] Ich werde die Prozedur zum Implementieren der Follow-Funktion mit form_with erklären.
[Mehrere Fotos registrieren] Registrieren Sie mehrere Schienenbilder gleichzeitig. Primitive Power-Technik
So machen Sie https zum Schema der URL, die vom URL-Helfer von Rails generiert wurde
[Schienen] Verwalten Sie mehrere Modelle mit einem Edelstein
Versuchen Sie, || anstelle des ternären Operators zu verwenden
[Rails] Temporäre Aufbewahrung von Daten pro Sitzung
Implementierung der Benutzerauthentifizierungsfunktion mit devise (2)
Die Identität der Schienenparameter [: id]
Implementierung der Benutzerauthentifizierungsfunktion mit devise (1)
[Rails] Ändern Sie den Labelnamen von f.label
Implementierung der Benutzerauthentifizierungsfunktion mit devise (3)
Der Inhalt der von CarrierWave gespeicherten Daten.
[Rails6] So verbinden Sie die von Scaffold generierte Buchungsfunktion mit der von devise generierten Benutzerfunktion