[RUBY] [Schienen] Verwalten Sie mehrere Modelle mit einem Edelstein

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.

Devise vorstellen

1. Installieren Sie Gem

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

2. Erstellen Sie gerätebezogene Dateien

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.

  1. Fügen Sie die folgenden Wörter zu 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 }
  1. Inhalt, der die URL beim Zugriff auf 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
  1. Fügen Sie eine Flash-Nachricht zu "app / views / layouts / application.html.erb" hinzu Ich habe geschrieben, was vorerst beschrieben wird.

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


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

    <%= yield %>
  </body>
</html>
  1. Es wird gesagt, dass Sie eine Ansicht generieren sollten, aber ich möchte 2 Muster erstellen, also werde ich sie vorerst ignorieren!

Einstellungen vornehmen

Ä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

Modellbildung entwickeln

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

Überprüfen Sie die Migrationsdatei

(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

Überprüfen Sie die Modelldatei

: 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

Bestätigung der Unhöflichkeit

Überprüfen Sie config / route.rb

config/routes.rb


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

Überprüfen Sie mit Bundle Exec Rails Routen

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

Ruding fix

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!

Ansicht erstellen

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!

Controller erstellen

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!

Bonus (für diejenigen, die die Omniauth-Authentifizierung einführen)

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 ...?

Vorerst abgeschlossen

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

[Schienen] Verwalten Sie mehrere Modelle mit einem Edelstein
Was ist Rails Gem Devise?
[Rails] Flow bei der Installation von Gem Devise
[Rails] Wie man Edelstein "devise" benutzt
[Schienen] Listen Sie Instanzen mehrerer Modelle auf
Implementieren Sie eine verfeinerte Suchfunktion für mehrere Modelle ohne Rails5-Juwel.
[Schienen] erfinden
[Rails] Verwalten wir Konstanten mit config gem
Erstellen Sie die Authentifizierungsfunktion in der Rails-Anwendung mit devise
Implementieren Sie eine Freigabeschaltfläche in Rails 6, ohne Gem zu verwenden
[Schienen für Anfänger] Geben Sie das Übergangsziel an, nachdem Sie sich bei mehreren Devise-Modellen angemeldet haben
[Rails] Einführung in das Gerät
[Rails] So laden Sie mehrere Bilder mit Carrierwave hoch
[Rails] Erstellen einer Brotkrumenliste mit Gem gretel
Speichern Sie Daten aus einer Excel-Datei mit Rails gem roo
[Für Anfänger von Rails] Mehrfachsuchfunktion ohne Gem implementiert
[Rails] entwickelt eine Hilfsmethode
[Rails] Passen Sie die Validierung des Geräts an
Flash-Nachricht mit Gerät
Gerät mit Schienen handhaben
[Rails] entwickeln eine Einführungsmethode
[Schienen] Standardwerte festlegen
[Rails] Registrieren Sie sich mit Devise nach Attributen desselben Modells
[Rails] Implementiere die Event-End-Funktion (logisches Löschen) mit Paranoia (Gem)
Holen Sie sich Youtube-Kanalinformationen mit der Rails-App (mit Yt gem)
[Rails] Suche aus mehreren Spalten + Bedingungen mit Gem und Ransack
[Ruby on Rails] Unendliches Scrollen mit Gem Kaminari und Jscroll