Beim Erstellen einer Anmeldefunktion usw. mit einem Edelstein namens "Rise-Gerät" Ich denke, es gibt Zeiten, in denen Sie den Anmeldebildschirm und die Verwaltung zwischen der Öffentlichkeit und dem Unternehmen trennen möchten.
Ich habe Devise verwendet, um Webanwendungen zu erstellen. Dies ist das erste Mal, dass ich es auf mehreren Modellen implementiert habe, daher möchte ich es als Memorandum behalten.
Umgebung
Ruby: 2.5.6
Rails: 5.2.4
devise: 4.7.3
Da ich in Docker arbeite, hat es "Bundle Exec", Wenn Sie sich außerhalb des Dockers befinden, entfernen Sie es bitte und geben Sie es ein.
Dieses Mal wollte ich auch eine Facebook-Authentifizierung durchführen, also habe ich dem Gemfile "devise" und "omniauth-twitter" hinzugefügt
Gemfile
gem 'devise'
gem 'omniauth-facebook'
Und Bundle installieren
Geben Sie den folgenden Befehl in das Terminal ein
bundle exec rails g devise:install
Ich denke, die folgenden Worte werden herauskommen
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 *
===============================================================================
Überprüfen Sie den Inhalt von jedem und fügen Sie sie hinzu.
config / environment / development.rb
hinzu.
Wie mir gesagt wurde, werde ich die Standard-URL auflisten.config/environments/development.rb
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
config / route.rb
als root festlegt (beim Zugriff auf die in 1 festgelegte URL)
Ich habe es noch nicht erstellt, also werde ich es hier erstellen.Terminal
bundle exec rails g controller Posts(Controller-Name) index
Stellen Sie die URL in config / route.rb
ein
config/routes.rb
Rails.application.routes.draw do
root 'posts#index'
end
ruby:app/views/layouts/application.html.erb
.
.
.
<body>
<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>
<%= yield %>
</body>
</html>
Ändern Sie die Einstellung von config / initializers / devise.rb
, um dem Anmeldebenutzer 2 Muster zu geben.
Es wurde ursprünglich auskommentiert, bitte suchen Sie danach!
config/initializers/devise.rb(Vorher ändern)
.
#config.scoped_views = false
.
.
#config.sign_out_all_scopes = true
.
config/initializers/devise.rb(Nach der veränderung)
#Geändert, um Anmeldebildschirme für mehrere Modelle zu trennen
config.scoped_views = true
#Verhindert das Abmelden von einem beim Abmelden vom anderen beim Anmelden mit mehreren Modellen
config.sign_out_all_scopes = false
Dieses Mal werde ich zwei Muster erstellen, die breite Öffentlichkeit und das Unternehmen!
Terminal
bundle exec rails g devise user
bundle exec rails g devise company
(Da eine ähnliche Datei außer dem Modellnamen generiert wurde, wird die Unternehmensmodelldatei weggelassen.)
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
: Omniauthable
und omniauth_providers: [: facebook]
hinzugefügt, um die Facebook-Authentifizierung einzubeziehen.
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
, wo Sie Änderungen und Ergänzungen vornehmen können
config/routes.rb
Rails.application.routes.draw do
devise_for :companies
devise_for :users
root 'postss#index'
end
Der Controller # Action-Teil ist für Unternehmen und Benutzer gleich. Mit anderen Worten, die Steuerungen sind gleich und müssen geändert werden. (* Nur Controller # Aktion wurde getrennt ... Es ist ärgerlich und ich kann es nicht reparieren, also schiebe es nach rechts ...! )
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'
}
Wenn Sie noch einmal mit "Bundle Exec Rails Routen" überprüfen, denke ich, dass der Controller-Teil sicher geändert wurde!
Dies ist der Teil, der nicht unterstützt wurde, als das erste "Rails g Devise: Install" ausgeführt wurde.
Terminal
bundle exec rails g devise:views users
bundle exec rails g devise:views companies
Ich denke, jede Datei wurde generiert!
Terminal
bundle exec rails generate devise:controllers users
bundle exec rails generate devise:controllers companies
Ich denke, dass das Ausführungsergebnis so sein wird.
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
===============================================================================
Der untere Teil, ein Regentag Fehler! ?? Ich dachte, aber es ist kein Fehler. (Heiß Da der Controller so aussieht, müssen Sie route.rb ~ die folgende Beschreibung hinzufügen Ich gebe ein Beispiel und lehre mich.
Da es früher eingestellt wurde, können Sie es ignorieren!
Bei dieser Rate tritt ein Fehler auf, selbst wenn Sie auf "http: // localhost: 3000 / users / sign_in" zugreifen. So etwas wie "undefinierte Methode" omniauth_authorize_path "für ~". ..
Ich werde hier nicht auf die Facebook-Authentifizierungseinstellungen eingehen. in app / views / users / shared / _links.html.erb Der Teil von omniauth_authorize_path (Ressourcenname, Anbieter) ist seltsam.
Wenn Sie das Ruding überprüfen, gibt es keinen Pfad mit dem Namen "omniauth_authorize_path". Es sollte "user_facebook_omniauth_authorize_path" sein. Beheben wir ihn also.
Ich habe den Namen nicht geändert als ...? Ich dachte, Ich war mir nicht sicher warum. Ist es von Anfang an ...?
Wie auch immer! Die Grundeinstellung ist vorerst abgeschlossen.
http: // localhost: 3000 / users / sign_in
und http: // localhost: 3000 / company / sign_in
Unabhängig davon, auf welche Weise Sie zugreifen, wird der Anmeldebildschirm angezeigt!
Fügen Sie weitere Spalten hinzu oder passen Sie sie bei Bedarf an!
Ich hoffe dieser Artikel hilft jemandem. Vielen Dank!
Recommended Posts