【Ruby on Rails】 gem의 devise를 사용하여 이름과 비밀번호만으로 로그인하는 방법

14152 단어 루비Railslogindevise

목표





개발 환경



루비 2.5.7
Rails 5.2.4.3
OS: macOS Catalina

전제



※ ▶◯◯를 선택하면 설명 등이 나오므로,
잘 모르는 경우의 참고로 해 주시면 좋겠습니다.

homes 컨트롤러를 작성해, 이하를 기술 완료.

config/routes.rb
root 'homes#top'
get 'mypage', to: 'homes#mypage'

app/controllers/homes_controller.rb
class HomesController < ApplicationController
 def top
 end
 def mypage
 end
end

1,devise 설치



Gemfile의 끝에 다음을 추가.

Gemfile

gem 'devise'

저장 후 터미널로 이동하여 다음을 실행.

터미널
$ bundle install

터미널
$ rails g devise:install

해설
rails g devise:install은 devise를 초기화합니다.

아래와 같은 표시가 되면 OK입니다.

터미널
===============================================================================

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 *

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

오류시
오류가 표시되면 Rails 업데이트로 인한 오류 가능성이 높기 때문에,
Gemfile의 gem 'sqlite3'을 검토하십시오.

2, 로그인 화면 표시



테이블 만들기(이름 추가)



통상시의 기술과는 달리,
devise의 독자적인 규칙인 「rails g devise 모델명」이라고 기술.
이번에는 User 모델을 작성하기 위해 터미널에서 다음을 실행.

터미널
$ rails g devise User

아래 폴더에서 t.string :name을 설명합니다.

db/migrate/xxxxxxxxxxxxx_devise_create_users.rb
...

      t.string :name  # ←ここに追加
      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


보충 1
null: false 를 기술하는 것으로, 하늘의 상태로의 보존을 막습니다.
null : false의 경우 여기

보충 2
이름 이외에도 등록 정보를 추가하려면,
t.string :name과 같이 기술하는 것으로 가능.
ex) t.string :phone_number 등

그 후 터미널로 이동하여 다음을 실행.

터미널
$ rails db:migrate

아래와 같은 표시가 되면 OK입니다.

터미널
== 20200901103907 DeviseCreateUsers: migrating ================================
-- create_table(:users)
   -> 0.0038s
-- add_index(:users, :email, {:unique=>true})
   -> 0.0013s
-- add_index(:users, :reset_password_token, {:unique=>true})
   -> 0.0013s
== 20200901103907 DeviseCreateUsers: migrated (0.0067s) =======================

view 만들기(이름 추가)



터미널
$ rails g devise:views users

해설
rails g devise:views users로 설정하면,
app/views/users 안에 devise의 views를 저장 가능.
views 편집도 가능.

3행째에 있는 <%= form_for %> 안에 다음을 기술.

app/views/devise/registrations/new.html.erb
...

  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name, autofocus: true, autocomplete: "name" %>
  </div>

...

아래의 3 개의 이메일을 이름으로, email_field를 text_field로 변경

app/views/devise/sessions/new.html.erb
  <div class="field">
    <%= f.label :email %><br />
    <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
  </div>

  ↓

  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name, autofocus: true, autocomplete: "name" %>
  </div>


49행 부근에 있는 아래의 설명을 코멘트 아웃 해 [:email]을 [:name]로 변경

config/initializers/devise.rb

config.authentication_keys = [:name]

  로그인 전의 view



app/views/homes/top.html.erb
<%= link_to '新規登録', new_user_registration_path %><br>
<%= link_to 'ログイン', new_user_session_path %>

로그인 후의 view



app/views/homes/mypage.html.erb
<%= current_user.name %><br>
<%= current_user.email %><br>
<%= link_to 'ログアウト', destroy_user_session_path, method: :delete %>

해설
current_user는 devise의 헬퍼 메소드이며, 로그인중의 유저 정보를 취득 가능.
로그아웃시는 http 메소드로의 착색은 없지만,
method: :delete를 지정해 주면 확실.

3, 컨트롤러 만들기



터미널
$ rails g devise:controllers users

4행째, 44~46행째, 54~56행째를 코멘트 아웃을 제외해,
45행의 :attribute를 :name, :email로 변경.
55행째의 super(resource)를 날리고 싶은 path로 변경.

app/controllers/users/registrations_controller.rb
# frozen_string_literal: true

class Users::RegistrationsController < Devise::RegistrationsController
  before_action :configure_sign_up_params, only: [:create]
  # before_action :configure_account_update_params, only: [:update]

...

  # protected

  # If you have extra params to permit, append them to the sanitizer.
  def configure_sign_up_params
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :email])
  end

  # If you have extra params to permit, append them to the sanitizer.
  # def configure_account_update_params
  #   devise_parameter_sanitizer.permit(:account_update, keys: [:attribute])
  # end

  # The path used after sign up.
  def after_sign_up_path_for(resource)
    mypage_path
  end

  # The path used after sign up for inactive accounts.
  # def after_inactive_sign_up_path_for(resource)
  #   super(resource)
  # end
end


해설
44~46행째로 신규 회원 등록시의 컬럼의 보존 허가를 지정.
55~56행째로 신규 회원 등록 후의 천이처를 지정.

보충 회원 정보 갱신 후의 천이처도 상기와 같이 하면 변경 가능. 설명은 57행 이하로 OK.
 def after_update_path_for(resource)
  mypage_path
 end

27행 이하에 추가.

app/controllers/users/sessions_controller.rb
...

  def after_sign_in_path_for(resource)
    mypage_path
  end

  def after_sign_out_path_for(resource)
    root_path
  end
end


해설
로그인시, 로그아웃시의 천이처 지정.

devise_for :users 아래에 추가 설명.

config/routes.rb
Rails.application.routes.draw do
  devise_for :users, controllers: {
    sessions: 'users/sessions',
    registrations: 'users/registrations',
  }
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html

  root 'homes#top'
  get 'mypage', to: 'homes#mypage'
end


P.S.



twitter에서는 Qiita에는 업하지 않는 기술이나 사고방식도 업하고 있으므로,
좋으면 팔로우 해 주시면 기쁩니다.
자세한 내용은 여기 htps : // 라고 해서 r. 이 m / 그럼 p를 rk

좋은 웹페이지 즐겨찾기