티스토리 뷰
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
'프로그래밍 공부 > Ruby on Rails : Gem' 카테고리의 다른 글
Ruby on Rails : 페이지(paginate) 2 [Gem : Pagy] (2) | 2019.11.05 |
---|---|
Ruby on Rails : 페이지(paginate) [Gem : kaminari] (0) | 2019.11.05 |
Ruby on Rails : 게시물 삭제 기록 남기기 [Gem : paranoia] (0) | 2019.11.05 |
Ruby on Rails : 조회수 구현 [Gem : impressionist] (0) | 2019.11.05 |
Ruby on Rails : DB 구조를 한눈에 [Gem : rails_db] (0) | 2019.11.05 |
댓글