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.
--devise ist bereits installiert
Column | Type | Options |
---|---|---|
name | string | null: false, unique: true, index:true |
string | null: false, unique: true, index:true | |
password | string | null: false |
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 |
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 |
--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
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.
--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
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.
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"
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.
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