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.
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
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.
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 }
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
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>
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
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
(É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
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
config/routes.rb
Rails.application.routes.draw do
devise_for :companies
devise_for :users
root 'postss#index'
end
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
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é!
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é!
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!
À 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 ...?
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