Notez que j'ai eu du mal à implémenter la fonction d'authentification dans Rails
Une bibliothèque pour implémenter des fonctions d'authentification dans Rails. De même, concevoir est l'une des fonctions d'authentification, mais la sorcellerie est plus simple et plus personnalisable. Cliquez ici pour le github du sorcier
Gemfile
gem 'sorcery'
Terminal
$ bundle install
Terminal
$ rails g sorcery:install
En tapant la commande ci-dessus, un fichier de migration pour le modèle utilisateur et la base de données sera généré.
・ App / modèles / user.rb
・ Config / initialiseurs / sorcery.rb
・ Db / migrate / yyyymmddhhmmss_sorcery_core.rb
db/migrate/yyyymmddhhmmss_sorcery_core.rb
class SorceryCore < ActiveRecord::Migration[5.2]
def change
create_table :users do |t|
t.string :name, null: false
t.string :email, null: false
t.string :crypted_password
t.string :salt, null: false
t.timestamps null: false
end
add_index :users, :email, unique: true
end
end
Cette fois, supposons que nous ayons des colonnes pour name
, email
et password
.
null: false
aux éléments requis.――La raison de mettre des restrictions est que si vous ne mettez pas de restrictions du côté de la base de données, l'exécution de SQL ou la manipulation directe des données peut entraîner des données incohérentes interdites par le modèle.
--Ajoutez à add_index
pour les éléments que vous souhaitez rendre unicité: true
dans le modèle.
La méthode de description de add_index
est la suivante.
add_index: nom de la table ,: nom de la colonne, unique: vrai
Terminal
$ rails db:migrate
--Une fois que vous avez décrit les restrictions de migration, générez la table des utilisateurs avec la commande ci-dessus.
app/modeks/user.rb
class User < ApplicationRecord
authenticates_with_sorcery!
validates :name, presence: true, length: { maximum: 255 } #Longueur de contrainte avec longueur
validates :email, presence: true, uniqueness: true #Contraindre l'unicité avec l'unicité
validates :password, length: { minimum: 3 }, if: -> { new_record? || changes[:crypted_password] }
validates :password, confirmation: true, if: -> { new_record? || changes[:crypted_password] }
validates :password_confirmation, presence: true, if: -> { new_record? || changes[:crypted_password] }
end
presence: true
, vous pouvez empêcher SQL d'enregistrer dans un état vide sans avoir à saisir des caractères vides depuis le navigateur.--Depuis que la contrainte (null: false et add_index: users ,: email, unique: true)
a été ajoutée côté base de données,
Contraignons également (présence: vrai ou unicité dans les validations)
côté modèle.
if: -> { new_record? || changes[:crypted_password] }
Cette description permet à l'utilisateur d'omettre la saisie du mot de passe s'il souhaite mettre à jour un élément de profil autre que le mot de passe.Terminal
$ rails g controller users new create
app/controllers/users_controller.rb
class UsersController < ApplicationController
def new
@user = User.new
end
def create
@user = User.new(user_params)
if @user.save
redirect_to login_path
else
render :new
end
end
private
def user_params
params.require(:user).permit(:name, :email, :password, :password_confirmation)
end
end
l'action de création
, redirigez vers l'écran de connexion. En cas d'échec, vous pouvez revenir à l'écran de connexion.ruby:app/views/users/new.html.erb
<%= form_with model: @user, local: true do |f| %>
<div class="form-group">
<%= f.label :name %>
<%= f.text_field :name, class: 'form-control' %>
</div>
<div class="form-group">
<%= f.label :email %>
<%= f.text_field :email, class: 'form-control' %>
</div>
<div class="form-group">
<%= f.label :password %>
<%= f.text_field :password, class: 'form-control' %>
</div>
<div class="form-group">
<%= f.label :password_confirmation %>
<%= f.text_field :password_confirmation, class: 'form-control' %>
</div>
<%= f.submit 'enregistrement', class: 'btn btn-primary' %>
<% end %>
<div class='text-center'>
<%= link_to 'Aller à la page de connexion', login_path %>
</div>
--Comment utiliser form_with
.
Transmettez la valeur saisie à la variable d'instance @user! Déclaré.
Il peut également être décrit comme users_path.
Les données saisies ici sont envoyées pour créer.
Le contenu du formulaire est dans user_params ou params [: user].
Recommended Posts