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