[RUBY] [Rails] Implementierung einer neuen Registrierungsfunktion im Assistentenformat mit devise

Einführung

Als ich eine Kopierseite von Furima erstellte, hatte ich Schwierigkeiten, weil ich die Struktur etwas schwierig machte, und beschloss, sie als Aufzeichnung zu führen. Wenn Sie Vorschläge haben, wie Sie es schöner machen können, bitte.

Implementierungsmethode

Entwicklungsumgebung

Annahme

--devise ist bereits installiert

DB Design

Benutzertabelle

Column Type Options
name string null: false, unique: true, index:true
email string null: false, unique: true, index:true
password string null: false

Profiltabelle

Column Type Options
first_name string null: false
family_name string null: false
first_name_kana string null: false
family_name_kana string null: false
introduction string null: true
year integer null: false
month integer null: false
day integer null: false

Tabelle "send_destinations (address)"

Column Type Options
first_name string null :false
family_name string null: false
first_name_kana string null: false
family_name_kana string null: false
post_code string null: false
prefecture string null: false
city string null:false
house_number string null: false
building_name string -
phone_number string unique: true, null: true
user_id references null: false, foreign_key: true

Code

Controller erstellen

--Erstellen Sie einen Benutzer-Controller unter Geräteverwaltung

Terminal


$ rails g devise:controllers users

routes.rb


Rails.application.routes.draw do
  devise_for :users, controllers: { registrations: 'users/registrations' }
  root to: 'items#index'
end

Beschreiben Sie die Zuordnung im Modell

user.rb


class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
  has_one :profile
  accepts_nested_attributes_for :profile
  has_one :sending_destination
end

profile.rb


class Profile < ApplicationRecord
  belongs_to :user, optional: true
end

sending_destination.rb


class SendingDestination < ApplicationRecord
  belongs_to :user, optional: true
end

optional: true ist eine Option, mit der der externe Schlüssel null sein kann.

Bearbeiten Sie die neue Aktion und die entsprechende Ansicht (Seite 1).

--Schreiben Sie eine neue Aktion in users / registrations_controller.rb

users/registrations_controller.rb


class Users::RegistrationsController < Devise::RegistrationsController
  #Kürzung
  def new
    @user = User.new
    @user.build_profile
  end 
  #Kürzung
end
 

ruby:devise/registrations/new.haml.html


= form_for(@user, url: user_registration_path) do |f|
  = render "devise/shared/error_messages", resource: @user
  = f.text_field :nickname
  = f.email_field :email
  = f.password_field :password
  = f.password_field :password_confirmation
  = f.fields_for :profile do |p|
    = p.text_field :family_name
    = p.text_field :first_name
    = p.text_field :family_name_kana
    = p.text_field :first_name_kana
    = p.select :year
    = p.select :month
    = p.select :day
  = f.submit "Nächster"

Eigentlich gibt es Beschreibungen von div, label und class, aber sie sind einfach geschrieben. Wir verwenden fields_for, um die beiden Modelle zu behandeln. Ich verweise auf die folgenden Artikel. [Rails] Senden von Werten an zwei Modelle gleichzeitig mithilfe des Entwurfsformulars (Beispiel: Benutzermodell und Profilmodell) [Rails] So registrieren Sie Daten für mehrere Modelle mit einem form_for

Aktion zum Erstellen bearbeiten

users/registrations_controller.rb


class Users::RegistrationsController < Devise::RegistrationsController
  #Kürzung
  def create
    @user = User.new(sign_up_params)
    @user.build_profile(sign_up_params[:profile_attributes])
    unless @user.valid?
      flash.now[:alert] = @user.errors.full_messages
      render :new and return
    end
    session["devise.regist_data"] = {user: @user.attributes}
    session["devise.regist_data"][:user]["password"] = params[:user][:password]
    session[:profile_attributes] = sign_up_params[:profile_attributes]
    @sending_destination = @user.build_sending_destination
    render :new_sending_destination
  end
  #Kürzung
  protected
  #Kürzung
end

Überprüfen Sie mit der Methode "valid?", Ob der Parameter die Validierung verletzt. Die Funktion "Sitzung", die die Informationen auf der Clientseite speichert, wird verwendet, damit die Informationen auch dann nicht verloren gehen, wenn sich die Seite ändert. Damit die Sitzung die Informationen in Form eines Hash-Objekts enthält, werden die Daten mithilfe der Attributmethode formatiert. Obwohl die Kennwortinformationen in den Parametern enthalten sind, sind die Kennwortinformationen nicht enthalten, wenn die Daten mit der Attributmethode formatiert werden. Sie müssen das Kennwort also erneut der Sitzung zuweisen. Erstellen Sie eine Instanz des Modells "send_destination", das der Instanz "@ user" zugeordnet ist, die dieses Mal mit "build_sending_destination" erstellt wurde. Rendern Sie anschließend die Ansicht der Aktion "new_sending_destination", in der die Seite angezeigt wird, auf der Sie Ihre Adressinformationen registrieren möchten.

Bearbeiten Sie die Aktion new_sending_destination und die entsprechende Ansicht (Seite 2).

routes.rb


Rails.application.routes.draw do
  devise_for :users, controllers: { registrations: 'users/registrations' }
  devise_scope :user do
    get 'sending_destinations', to: 'users/registrations#new_sending_destination'
    post 'sending_destinations', to: 'users/registrations#create_sending_destination'
  end

  root to: 'items#index'
end

--Erstellen Sie die entsprechende Ansichtsdatei new_sending_destination.html.haml

ruby:devise/registrations/new_sending_destination.html.haml


= form_for @sending_destination do |f|
  = render "devise/shared/error_messages", resource: @sending_destination
  = f.text_field :family_name
  = f.text_field :first_name
  = f.text_field :family_name_kana
  = f.text_field :first_name_kana
  = f.text_field :post_code
  = f.text_field :prefecture
  = f.text_field :city
  = f.text_field :house_number
  = f.text_field :building_name
  = f.number_field :phone_number
  = f.submit "zu registrieren"  

Bearbeiten Sie die Aktion create_sending_destination

users/registrations_controller.rb


class Users::RegistrationsController < Devise::RegistrationsController
  #Kürzung
  def create_sending_destination
    @user = User.new(session["devise.regist_data"]["user"])
    @profile = @user.build_profile(session[:profile_attributes])
    @sending_destination = SendingDestination.new(sending_destination_params)
    unless @sending_destination.valid?
      flash.now[:alert] = @sending_destination.errors.full_messages
      render :new_sending_destination and return
    end
    @user.build_sending_destination(@sending_destination.attributes)
    @user.save
    @profile.save
    session["devise.regist_data"]["user"].clear
    session[:profile_attributes].clear
    sign_in(:user, @user)

    redirect_to root_path
  end

  protected

  def sending_destination_params
    params.require(:sending_destination).permit(
      :first_name,
      :family_name,
      :first_name_kana, 
      :family_name_kana, 
      :post_code, 
      :prefecture, :city, 
      :house_number, 
      :building_name, 
      :phone_number
    )
  end
end

Die in der Sitzung gespeicherten Informationen werden jeder Instanz von "@ user" und "@ prfile" zugewiesen. Überprüfen Sie die Adressinformationen auf der zweiten Seite mit "gültig?". Weisen Sie die mit build_sending_destination gesendeten Parameter @ user zu, das die gehaltene Sitzung enthält. Speichern Sie es dann mit der Methode "save" in der Tabelle. Löschen Sie die Sitzung mit der Methode "Löschen". Melden Sie sich mit "sign_in (: user, @user)" an und wechseln Sie mit "redirect_to root_path" zur obersten Seite.

abschließend

Es kann durch das obige Verfahren implementiert werden. Durch die Verwendung von "fields_for" auf der ersten Seite hatte ich große Probleme, die Sitzung zuzuweisen, aber dank dieser konnte ich darüber nachdenken, wie es funktioniert. Ich habe es nicht im Detail erklärt, aber ich habe versucht, einen Artikel zu schreiben, der auch als Ausgabe dient. Ich hoffe, dass er so hilfreich wie möglich ist.

Recommended Posts

[Rails] Implementierung einer neuen Registrierungsfunktion im Assistentenformat mit devise
Implementierung der Benutzerauthentifizierungsfunktion mit devise (2)
Implementierung der Benutzerauthentifizierungsfunktion mit devise (1)
Implementierung der Benutzerauthentifizierungsfunktion mit devise (3)
[Rails] Implementierung der Suchfunktion mit Gem's Ransack
Erstellen Sie die Authentifizierungsfunktion in der Rails-Anwendung mit devise
[Rails] Implementierung der Bildvergrößerungsfunktion mit Lightbox2
Implementierung der Ruby on Rails-Anmeldefunktion (Devise Edition)
[Rails] Implementierung einer mehrschichtigen Kategoriefunktion unter Verwendung der Abstammung "Vorbereitung"
[Rails] Implementierung der Kategoriefunktion
[Rails] Implementierung einer mehrschichtigen Kategoriefunktion unter Verwendung der "Seed Edition" der Vorfahren
[Rails] Implementierung der Tutorial-Funktion
[Rails] Implementierung einer ähnlichen Funktion
[Rails] Implementierung einer mehrschichtigen Kategoriefunktion unter Verwendung der Abstammung "Edit Form Edition"
[Rails] Implementierung einer mehrschichtigen Kategoriefunktion unter Verwendung der Abstammung "Erstellungsformular"
Implementierung der Rails-Sortierfunktion (angezeigt in der Reihenfolge der Anzahl der Gleichen)
Implementieren Sie die Benutzerregistrierungsfunktion und die Unternehmensregistrierungsfunktion separat in Rails devise
[Rails] Implementierung der CSV-Importfunktion
[Rails] Asynchrone Implementierung der Like-Funktion
[Rails] Implementierung des Anmeldebildschirms in Devise
[Rails] Implementierung der Bildvorschau
[Rails] Über die Implementierung der Like-Funktion
[Rails] Implementierung der Benutzerrückzugsfunktion
[Rails] Implementierung der CSV-Exportfunktion
Implementierung einer ähnlichen Funktion in Java
[Implementierungsverfahren] Erstellen Sie eine Benutzerauthentifizierungsfunktion mithilfe von Hexerei in Rails
[Rails] Implementierung der Couponfunktion (mit automatischer Löschfunktion mittels Stapelverarbeitung)
[Rails] Implementierung der Tag-Funktion mit Acts-as-Taggable-On und der Funktion zur Vervollständigung der Tag-Eingabe mit Tag-It
[rails6.0.0] Speichern von Bildern mit Active Storage im Assistentenformat
[Rails] Funktionseinschränkungen im Gerät (Login / Logout)
Rails [Für Anfänger] Implementierung der Kommentarfunktion
[Ruby on Rails] Implementierung einer ähnlichen Funktion
[Rails] Ich werde die Prozedur zum Implementieren der Follow-Funktion mit form_with erklären.
Implementierung der Ruby on Rails-Anmeldefunktion (Sitzung)
Implementieren Sie die Sternebewertungsfunktion mit Raty in Rails 6
[Rails] Implementierung von "Benachrichtigung auf irgendeine Weise benachrichtigen"
[Rails] Implementierung des PV-Nummernrankings mit Impressionist
[Rails] Implementierung einer Bild-Diashow mit Bootstrap 3
[Rails / devise] Implementierung der Funktion zum Bearbeiten von Kontoinformationen / Verfahren zum Ändern des Umleitungsziels
[Rails] Implementierung der Drag & Drop-Funktion (mit Wirkung)
[Rails] Implementieren Sie die Registrierungs- / Löschfunktion für Kreditkarten in PAY.JP
Implementierung der Suchfunktion
Implementierung der Pagenationsfunktion