티스토리 뷰

프로그래밍 공부/Ruby on Rails : Gem

Ruby on Rails : 로그인/회원가입 [Gem : devise]

마음 따뜻한 개발자, 나른한 하루 2019. 11. 3. 22:56

해당 글은 https://blog.naver.com/kbs4674/221263801292 로 부터 게시글이 이전되었습니다.

 

Devise는 유저들의 로그인, 회원가입 등 기능 구현을 도와주는 Gem 입니다.

이번 시간에는 간단하게 Devise 설치법 및 간단한 활용에 대해 알아보겠습니다.

 

 

  • Devise : 로그인/회원가입

1. 터미널에 다음 명령어를 입력해주세요.

rails g scaffold homes title content

그리고 나중에 실습 확인을 위해  config/routes.rb  에서 root URI 규칙을 설정합니다.

root 'homes#index'

 

2.  Gemfile  파일로 이동 후, Gemfile 맨 아래에 다음 내용을 입력해주세요.

gem 'devise'

그리고 Gem을 설치합니다.

bundle install

 

3. 터미널에 다음 명령어를 입력해주세요.

rails g devise:install

그러면

다음과같이 Devise 환경 설정 파일들이 생성된게 확인됩니다.

 참고1 

  • devise.rb : 이메일 연동, Devise 세부설정 등에 쓰임.
  • devise.en.yml : 영문에 대한 안내멘트 출력, 나중에 devise 안내멘트 번역에 사용됨.

 참고2  

 

방금전의 명령어를 터미널에 입력 시, 위와같은 안내사항이 나오는데, 위 안내사항은 가볍게 넘기기에는 중요한 사항이 많습니다.

  1. 각 환경(development/test/production)에 따른 환경 설정 안내

  2.  config/routes.rb 에서 root 설정 해달라는 안내

  3. Devise의 상태를 보여주기 위해 다음 코드를 써달라는 안내 :

    <%= notice %> : 로그인, 로그아웃 등 이벤트에 따른 안내멘트

    <%= alert %> : 경고(로그인 실패 등) 안내멘트

  4. Devise View를 만들 수 있는 안내

 

 

4. 터미널 마지막 문구에 언급된 대로 Devise를 구성하는 View 파일을 생성해보겠습니다.

다음 명령어를 입력해주세요.

rails g devise:views

 app/views  디렉토리에 위 사진과 같이 Devise를 구성하는 View 파일들이 생성된게 확인 가능합니다.

 참고  Devise View 파일 한국어 번역처리하기 [클릭]

 

5. Devise Model(DB)를 만들기 위해 다음 명령어를 입력해주세요.

rails g devise User

그러면 user라는 이름의 모델 및 users테이블이 생성됩니다.

그리고 DB의 최신화를 위해 다음 명령어를 입력해주세요.

rake db:migrate

 

6. 서버가 켜져있는 경우 서버를 껏다 켜주세요.

 

 

  • Devise 문법 소개

  • current_user : 현재 유저에 대한 모델 정보가 모두 있습니다.
## current_user 문법 활용 예시

current_user.email

 

  • user_signed_in? : 유저가 로그인이 되어있는지 검사합니다.
## user_signed_in? 문법 활용 예시

<% if user_signed_in? %>
        안녕하세요, <%= current_user.email %> 님!
<% else %>
        <%= link_to "로그인", user_session_path %>
        <%= link_to "회원가입", "/users/sign_up" %>
<% end %>

 

 

  • Devise : 간단한 예제

Devise을 활용한 간단히 예제를 따라해보겠습니다.

 

<body> <%= yield %> 코드 사이에 아래의 코드를 입력해주세요.

## app/views/layouts/application.html.erb
 
<body>
	<div>
		<% if user_signed_in? %>
			<%= link_to "회원정보", edit_user_registration_path %>
			<%= link_to "로그아웃", destroy_user_session_path, method: :delete %>
		<% else %>
			<%= link_to "로그인", user_session_path %>
			<%= link_to "회원가입", "/users/sign_up" %>
		<% end %>
	</div>
	<hr/>
	<%= alert %>
	<%= notice %>
	<h2 style="font-weight: bold">로그인 정보</h2>
	<% if user_signed_in? %>
		<div>
			아이디 : <%= current_user.email %><br/>
			유저 No. : <%= current_user.id %>
		</div>
	<% else %>
		로그인 되어있지 않음.
	<% end %>

    <%= yield %>

어느 페이지를 이동하든, 로그인/로그아웃 여부에 따른 회원 로그인 상태를 볼 수 있습니다.

더 나아가서,  app/controllers/homes_controller.rb  에 한 줄의 코드를 작성해보겠습니다.

class HomesController < ApplicationController
  before_action :authenticate_user!
  
  ...
end

Controller에 가서

before_action :authenticate_user!

위 코드를 추가해보세요!

 

그리고 로그인이 되어있다면, 로그아웃 후, root페이지로 이동해보세요.

바로 로그인 먼저 하라며, 로그인 페이지로 이동될겁니다.

 

 참고  before_action :authenticate_user! 코드는 로그인 유무를 체크하는 코드로서, 로그인이 되어있지 않다면 자동으로 로그인 페이지로 이동시킵니다.

 

 

  •  참고  Devise Controller을 커스터마이징해서 사용하고 싶을 시
rails generate devise:controllers users

다음 명령어를 입력하면  app/controllers/users  위치에 Devise를 구성하는 Controller들이 나옵니다.

여러분들은 Controller을 편집하신 후,  config/routes.rb  로 이동해서

devise_for :users, controllers: { sessions: 'users/sessions' }

다음 명령어와 같이 Devise에 사용(연동) 될 Controller들을 명시해내면 됩니다.

 

 주의  Devise Controller는  config/routes.rb  에 위 코드와 같이 정의를 내려주지 않으면 컨트롤러 적용이 안됩니다.

 예시   users/registrations_controller.rb  파일을 커스터마이징 한 후, 해당 컨트롤러와 연동을 하고 싶다면

devise_for :users, controllers: { registrations: 'users/registrations' }

 

 

  • Devise : 오류메세지 출력

에러메세지 출력란

혹시 로그인 실패, Form 미작성 시 나오는 오류메세지를 출력하고 싶다면 다음 과정을 따라해보세요.

 

그렇다면  app/helpers/  폴더에  devise_helper.rb  파일을 새로 추가시키고, 해당 파일에 다음을 입력하세요.

 참고  안내 메세지 창은 부트스트랩 4.1 버전 기준입니다.

module DeviseHelper
  def devise_error_messages!
    return '' if resource.errors.empty?
 
    messages = resource.errors.full_messages.map { |msg| content_tag(:li, msg) }.join
    sentence = I18n.t('errors.messages.not_saved',
      count: resource.errors.count,
      resource: resource.class.model_name.human.downcase)
 
    html = <<-HTML
    <div class="alert alert-danger alert-dismissible fade show" role="alert">
      <button type="button" class="close" data-dismiss="alert">&times;</button>
      <h6><b>#{sentence}</b></h6>
      #{messages}
    </div>
    HTML
 
    html.html_safe
  end
end

 

 

  • 연결고리

Ruby on Rails : devise 한글번역 + 'Time-Ago 번역' [Gem : devise-i18n]

Ruby on Rails : Devise 문제 이슈 및 해결방안 (게시글을 쓰고 회원탈퇴를 한다면..?)

Ruby on Rails : Devise에 닉네임, 오늘의 한마디 기능 넣기

Ruby on Rails : devise를 활용한 이메일 인증 [Gem : devise]

Ruby on Rails : 구글 연동 로그인 API [Gem : omniauth-google-oauth2] 외...

Ruby on Rails : Devise 로그인 Form 변경하기

Ruby on Rails : Rolify + Cancancan 권한 지정/권한 관리 [Gem : rolify, cancancan]

Ruby on Rails : 어드민 관리자 페이지 [Gem : rails_admin]

Ruby on Rails : JWT with devise [gem : jwt]

 

 

 

루비온 레일즈 Ruby on RaiRuby on Rails : devise 한글번역 + 'Time-Ago 번역' [Gem : devise-i18n]ls ROR

댓글
댓글쓰기 폼
공지사항
Total
141,931
Today
184
Yesterday
299
링크
«   2021/09   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    
글 보관함