[RUBY] [Rails] Gérez plusieurs modèles à l'aide de la gemme de devise

Lors de la création d'une fonction de connexion, etc. en utilisant une gemme appelée devise of Rails Je pense qu'il y a des moments où vous souhaitez séparer l'écran de connexion et la gestion entre le grand public et l'entreprise.

J'ai utilisé la conception pour créer des applications Web, C'est la première fois que je le mets en œuvre sur plusieurs modèles, je voudrais donc le garder sous forme de mémorandum.

environnement


Ruby:   2.5.6
Rails:  5.2.4
devise: 4.7.3

Depuis que je travaille dans docker, il a bundle exec, Si vous êtes en dehors du docker, veuillez le supprimer et le saisir.

Présentation de la devise

1. Installez Gem

Je voulais aussi faire une authentification Facebook cette fois, alors j'ai ajouté devise et omniauth-twitter au Gemfile

Gemfile


gem 'devise'
gem 'omniauth-facebook'

Et installation groupée

2. Créez des fichiers liés à la conception

Entrez la commande suivante dans le terminal

bundle exec rails g devise:install

Je pense que les mots suivants sortiront

create  config/initializers/devise.rb
      create  config/locales/devise.en.yml
===============================================================================

Depending on your application's configuration some manual setup may be required:

  1. Ensure you have defined default url options in your environments files. Here
     is an example of default_url_options appropriate for a development environment
     in config/environments/development.rb:

       config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }

     In production, :host should be set to the actual host of your application.

     * Required for all applications. *

  2. Ensure you have defined root_url to *something* in your config/routes.rb.
     For example:

       root to: "home#index"
     
     * Not required for API-only Applications *

  3. Ensure you have flash messages in app/views/layouts/application.html.erb.
     For example:

       <p class="notice"><%= notice %></p>
       <p class="alert"><%= alert %></p>

     * Not required for API-only Applications *

  4. You can copy Devise views (for customization) to your app by running:

       rails g devise:views
       
     * Not required *

===============================================================================

Vérifiez le contenu de chacun et ajoutez-les.

  1. Ajoutez les mots suivants à config / environnements / development.rb. Comme on m'a dit, je vais lister l'URL par défaut.

config/environments/development.rb


config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
  1. Contenu qui définit l'URL lors de l'accès à config / routes.rb en tant que root (lors de l'accès à l'URL définie en 1) Je ne l'ai pas encore créé, je vais donc le créer ici.

Terminal


bundle exec rails g controller Posts(Nom du contrôleur) index

Définissez l'URL dans config / routes.rb

config/routes.rb


Rails.application.routes.draw do
  root 'posts#index'
end
  1. Ajoutez un message flash à app / views / layouts / application.html.erb J'ai écrit ce qui est décrit pour le moment.

ruby:app/views/layouts/application.html.erb


.
.
.
  <body>
    <p class="notice"><%= notice %></p>
    <p class="alert"><%= alert %></p>

    <%= yield %>
  </body>
</html>
  1. Il est dit que vous devriez générer une vue, mais je veux créer 2 modèles, donc je vais l'ignorer pour l'instant!

définir les paramètres

Changez le paramètre de config / initializers / devise.rb pour créer 2 modèles de connexion. Il a été initialement commenté, alors cherchez-le!

config/initializers/devise.rb(Changer avant)


.
#config.scoped_views = false
.
.
#config.sign_out_all_scopes = true
.

config/initializers/devise.rb(Après le changement)


#Modification des écrans de connexion séparés pour plusieurs modèles
config.scoped_views = true
#Empêche la déconnexion de l'un lors de la déconnexion de l'autre lors de la connexion avec plusieurs modèles
config.sign_out_all_scopes = false

concevoir la création de modèles

Cette fois, je vais faire deux patrons, le grand public et l'entreprise!

Terminal


bundle exec rails g devise user
bundle exec rails g devise company

Vérifiez le fichier de migration

(Étant donné que le même fichier que le nom du modèle est généré, le fichier du modèle d'entreprise est omis.)

db/migrate/20201112105533_devise_create_users.rb


# frozen_string_literal: true

class DeviseCreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
      ## Database authenticatable
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""

      ## Recoverable
      t.string   :reset_password_token
      t.datetime :reset_password_sent_at

      ## Rememberable
      t.datetime :remember_created_at

      ## Trackable
      # t.integer  :sign_in_count, default: 0, null: false
      # t.datetime :current_sign_in_at
      # t.datetime :last_sign_in_at
      # t.string   :current_sign_in_ip
      # t.string   :last_sign_in_ip

      ## Confirmable
      # t.string   :confirmation_token
      # t.datetime :confirmed_at
      # t.datetime :confirmation_sent_at
      # t.string   :unconfirmed_email # Only if using reconfirmable

      ## Lockable
      # t.integer  :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
      # t.string   :unlock_token # Only if unlock strategy is :email or :both
      # t.datetime :locked_at


      t.timestamps null: false
    end

    add_index :users, :email,                unique: true
    add_index :users, :reset_password_token, unique: true
    # add_index :users, :confirmation_token,   unique: true
    # add_index :users, :unlock_token,         unique: true
  end
end

Vérifiez le fichier du modèle

Ajout de : omniauthable et omniauth_providers: [: facebook] pour incorporer l'authentification Facebook.

models/user.rb


class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable, :omniauthable, omniauth_providers: [:facebook]
end

Bundle exec rails db: migrate où vous pouvez apporter des modifications et des ajouts

Confirmation de ruding

Vérifiez config / routes.rb

config/routes.rb


Rails.application.routes.draw do
  devise_for :companies
  devise_for :users
  root 'postss#index'
end

Vérifiez avec les itinéraires de rails exécutifs de bundle

La partie Controller # Action est la même pour l'entreprise et l'utilisateur. En d'autres termes, les contrôleurs sont les mêmes et doivent être modifiés. (* Seule l'action du contrôleur # a été séparée ... C'est ennuyeux et je ne peux pas le réparer, alors faites-le glisser vers la droite ...! )

Terminal


          Prefix Verb             URI Pattern                                                                          Controller#Action
             new_company_session GET      /companies/sign_in(.:format)                                                            devise/sessions#new
                 company_session POST     /companies/sign_in(.:format)                                                            devise/sessions#create
         destroy_company_session DELETE   /companies/sign_out(.:format)                                                           devise/sessions#destroy
            new_company_password GET      /companies/password/new(.:format)                                                       devise/passwords#new
           edit_company_password GET      /companies/password/edit(.:format)                                                      devise/passwords#edit
                company_password PATCH    /companies/password(.:format)                                                           devise/passwords#update
                                 PUT      /companies/password(.:format)                                                           devise/passwords#update
                                 POST     /companies/password(.:format)                                                           devise/passwords#create
     cancel_company_registration GET      /companies/cancel(.:format)                                                             devise/registrations#cancel
        new_company_registration GET      /companies/sign_up(.:format)                                                            devise/registrations#new
       edit_company_registration GET      /companies/edit(.:format)                                                               devise/registrations#edit
            company_registration PATCH    /companies(.:format)                                                                    devise/registrations#update
                                 PUT      /companies(.:format)                                                                    devise/registrations#update
                                 DELETE   /companies(.:format)                                                                    devise/registrations#destroy
                                 POST     /companies(.:format)                                                                    devise/registrations#create
                new_user_session GET      /users/sign_in(.:format)                                                                 devise/sessions#new
                    user_session POST     /users/sign_in(.:format)                                                                 devise/sessions#create
            destroy_user_session DELETE   /users/sign_out(.:format)                                                                devise/sessions#destroy
user_facebook_omniauth_authorize GET|POST /users/auth/facebook(.:format)                                                           devise/omniauth_callbacks#passthru
 user_facebook_omniauth_callback GET|POST /users/auth/facebook/callback(.:format)                                                  devise/omniauth_callbacks#facebook
               new_user_password GET      /users/password/new(.:format)                                                            devise/passwords#new
              edit_user_password GET      /users/password/edit(.:format)                                                           devise/passwords#edit
                   user_password PATCH    /users/password(.:format)                                                                devise/passwords#update
                                 PUT      /users/password(.:format)                                                                devise/passwords#update
                                 POST     /users/password(.:format)                                                                devise/passwords#create
        cancel_user_registration GET      /users/cancel(.:format)                                                                  devise/registrations#cancel
           new_user_registration GET      /users/sign_up(.:format)                                                                 devise/registrations#new
          edit_user_registration GET      /users/edit(.:format)                                                                    devise/registrations#edit
               user_registration PATCH    /users(.:format)                                                                         devise/registrations#update
                                 PUT      /users(.:format)                                                                         devise/registrations#update
                                 DELETE   /users(.:format)                                                                         devise/registrations#destroy
                                 POST     /users(.:format)                                                                         devise/registrations#create

Correctif grossier

config/routes.rb


devise_for :companies, controllers: {
    sessions:      'companies/sessions',
    passwords:     'companies/passwords',
    registrations: 'companies/registrations'
  }
  devise_for :users, controllers: {
    sessions:           'users/sessions',
    passwords:          'users/passwords',
    registrations:      'users/registrations',
    omniauth_callbacks: 'users/omniauth_callbacks'
  }

Si vous vérifiez à nouveau avec bundle exec rails routes, je pense que la partie contrôleur a été modifiée en toute sécurité!

Créer une vue

C'est la partie qui n'était pas prise en charge lorsque le premier rails g devise: install a été exécuté.

Terminal


bundle exec rails g devise:views users
bundle exec rails g devise:views companies

Je pense que chaque fichier a été généré!

Créer un contrôleur

Terminal


bundle exec rails generate devise:controllers users
bundle exec rails generate devise:controllers companies

Je pense que le résultat de l'exécution sera comme ça.

create  app/controllers/users/confirmations_controller.rb
      create  app/controllers/users/passwords_controller.rb
      create  app/controllers/users/registrations_controller.rb
      create  app/controllers/users/sessions_controller.rb
      create  app/controllers/users/unlocks_controller.rb
      create  app/controllers/users/omniauth_callbacks_controller.rb
===============================================================================

Some setup you must do manually if you haven't yet:

  Ensure you have overridden routes for generated controllers in your routes.rb.
  For example:

    Rails.application.routes.draw do
      devise_for :users, controllers: {
        sessions: 'users/sessions'
      }
    end

===============================================================================

La partie inférieure, une erreur de jour de pluie! ?? J'ai pensé, mais ce n'est pas une erreur. (Chaud Puisque le contrôleur ressemble à ceci, vous devez ajouter la description suivante à routes.rb ~ Je donne un exemple et m'apprends.

Comme il a été défini plus tôt, vous pouvez l'ignorer!

Bonus (pour ceux qui introduisent l'authentification omniauth)

À ce rythme, même si vous accédez à http: // localhost: 3000 / users / sign_in, une erreur se produira. Quelque chose comme `` méthode non définie omniauth_authorize_path'for ~ `. ..

Je n'entrerai pas dans les paramètres d'authentification Facebook ici, dans app / views / users / shared / _links.html.erb La partie de omniauth_authorize_path (nom_ressource, fournisseur) est étrange.

Si vous vérifiez le ruding, il n'y a pas de chemin appelé omniauth_authorize_path, il devrait être user_facebook_omniauth_authorize_path, donc corrigeons-le.

Je n'ai pas changé le nom en utilisant comme ...? J'ai pensé, Je ne savais pas pourquoi. Est-ce depuis le début ...?

Terminé pour le moment

En tous cas! Pour le moment, la partie réglage de base est terminée.

http: // localhost: 3000 / users / sign_in et http: // localhost: 3000 / companies / sign_in Quelle que soit la manière dont vous accédez, vous verrez l'écran de connexion!

Ajoutez plus de colonnes ou personnalisez si nécessaire!

J'espère que cet article aide quelqu'un. Merci beaucoup!

Recommended Posts

[Rails] Gérez plusieurs modèles à l'aide de la gemme de devise
Qu'est-ce que Rails Gem Concevoir?
[Rails] Flux lors de l'installation du dispositif de gemmes
[Rails] Comment utiliser la "devise" des gemmes
[Rails] Répertorier les instances de plusieurs modèles
Implémentez une fonction de recherche affinée pour plusieurs modèles sans gemme Rails5.
[Rails] concevoir
[Rails] Gérons les constantes avec config gem
Créer une fonction d'authentification dans l'application Rails à l'aide de devise
Implémenter un bouton de partage dans Rails 6 sans utiliser Gem
[Rails pour débutants] Spécifiez la destination de la transition après vous être connecté à plusieurs modèles Devise
[Rails] Présentation du dispositif
[Rails] Comment télécharger plusieurs images à l'aide de Carrierwave
[Rails] Création d'une liste de miettes de pain à l'aide de Gem gretel
Enregistrer les données d'un fichier Excel à l'aide de Rails Gem Roo
[Pour les débutants de Rails] Implémentation de la fonction de recherche multiple sans Gem
[Rails] conçoit une méthode d'aide
[Rails] Personnaliser la validation de l'appareil
Message flash à l'aide de devise
Manipuler le dispositif avec des rails
[Rails] conçoit une méthode d'introduction
[rails] concevoir les valeurs par défaut
[Rails] Enregistrez-vous par attribut du même modèle en utilisant Devise
[Rails] Implémenter la fonction de fin d'événement (suppression logique) en utilisant la paranoïa (gem)
Obtenez des informations sur la chaîne Youtube avec l'application Rails (en utilisant Yt gem)
[Rails] Recherche à partir de plusieurs colonnes + conditions avec Gem et ransack
[Ruby on Rails] Défilement infini à l'aide de gem kaminari et jscroll