[ROR]devise gem 질문입니다


  • Level 9

    회원가입할때 아이디를 이메일 형식이 아니라 다른걸로 바꾸고 싶은데 어느 부분의 정규표현식을 바꿔야 할까요?

  • Level 8

    1. 서버 재시작.
    • config 안의 파일을 수정했을 경우, 서버를 on/off 해야합니다.
    1. 한번 직접 시연 해보세요!
  • Level 8

    1. config/initializers/devise.rb 파일을 열람 후,
    config.authentication_keys = [ :login ]
    

    위 코드를 추가해주세요.
    :login은 User model 파일에 작성됐던 def login Method와 연동됩니다.

    1. 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 %>
    
  • Level 8

    해당 방법에 대해 알아보니, 새로운 컬럼(Attribute)을 추가 후, User 모델 및 devise.rb 설정을 조금 바꿔줘야 하는게 있습니다.

    • 사용하시는 Devise 모델 이름이 User 라는 가정하에 설명을 작성해보겠습니다.
    1. Devise User 테이블의 새로운 컬럼을 생성합니다.
    rails generate migration add_username_to_users username:string
    
    1. schema 업데이트를 합니다.
    rake db:migrate
    
    1. 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를 허용하도록 하는 코드입니다.

    1. app/models/user.rb 파일을 열람 후 코드 수정을 합니다.
      ① Devise 옵션에 다음 내용을 추가합니다.
    :authentication_keys => {email: false, login: true}
    
    • 적용 예시
    ## app/models/user.rb
    
    devise :database_authenticatable, :registerable,
             :recoverable, :rememberable, :authentication_keys => {email: false, login: true}
    

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

    ## 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
    
    1. 다음 과정에 이어서 내용 이어가겠습니다.

ONLINE USERS

POPULAR TOPICS

SUGGESTED TOPICS

  • 3
  • 3
  • 4
  • 3
  • 4
  • 4
  • 3