티스토리 뷰

Devise 사용에 있어, email 입력보단 이메일 형식이 아닌 아이디 형식으로 입력을 원할 때가 있습니다.

이번 글에서는 해당 방법에 대해 알아보겠습니다.

 

 

  • 이메일 대신 다른 Form 입력받기

 참고 

  • 해당 설명은 Devise Gem이 깔려있어야 합니다. [클릭]
  • 사용하시는 Devise 모델 이름이 User 라는 가정하에 설명을 작성해보겠습니다.

 

1. Devise User 테이블의 새로운 컬럼을 생성합니다.

rails generate migration add_username_to_users username:string

컬럼 추가 후, schema 업데이트를 합니다.

 

2.  app/controllers/application_controller.rb  파일을 열람 후, 다음 코드를 추가합니다.

class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    added_attrs = [:username, :email, :password, :password_confirmation, :remember_me]
		
    devise_parameter_sanitizer.permit :sign_up, keys: added_attrs
    devise_parameter_sanitizer.permit :account_update, keys: added_attrs
  end
end

 참고  위 코드는 User 테이블에서 추가된 username 컬럼(Attribute)에 대해 Write/Update를 허용하도록 하는 코드입니다.

 

3.  app/models/user.rb  파일을 열람 후 코드 수정을 합니다.

1) Devise 옵션에 다음 내용을 추가합니다.

:authentication_keys => {email: false, username: true}
## app/models/user.rb
## 적용 예시

devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :authentication_keys => {email: false, username: true}

 

2) 이어서 다음 내용을 작성해냅니다.

## app/models/user.rb
 
# nil 처리 예외처리
validates :username, presence: :true, uniqueness: { case_sensitive: false }
	
def login
  @login || self.username || self.email
end

## 로그인 요청 시 검증하는 과정	
def self.find_for_database_authentication(warden_conditions)
  conditions = warden_conditions.dup
  if login = conditions.delete(:login)
    where(conditions.to_h).where(["lower(username) = :value OR lower(email) = :value", { :value => login.downcase }]).first
  elsif conditions.has_key?(:username) || conditions.has_key?(:email)
    where(conditions.to_h).first
  end
end

 

4.  config/initializers/devise.rb  파일을 열람 후, 아래 코드를 추가해주세요.

config.authentication_keys = [ :login ]

 참고  :login은 User model 파일에 작성됐던 def login Method와 연동됩니다.

 

5.  app/views/devise/sessions/new.html.erb  에서 form태그를 변경해주세요.

## email input 태그는 주석처리 혹은 제거, :login field 추가

- <%= f.input :email, required: false, autofocus: true, input_html: { autocomplete: "email" } %>
+ <%= f.text_field :login %>

 

6. 서버를 껏다 켜주세요!

 참고  config 폴더 내의 파일이 수정되면 서버를 껏다 켜야 합니다.

 

7. 한번 직접 시연 해보세요!

 

 

  • 자료 참고

1. Devise Github Document [클릭]

 

루비온 레일즈 Ruby on Rails ROR

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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
글 보관함