[RoR] [공부 메모] Device의 사용자 등록 실패 시의 전환처를 커스터마이즈

기사의 목적


  • Rails에서 Device를 이용했을 때, 사용자 등록 (signup)에 실패시의 천이처를 변경하고 싶었지만 빠졌다
  • 대응방법을 망비록으로서 기사로 한다
  • 결론적으로 Device 소스 코드를 읽는 것이 중요합니다

  • 실현하고 싶은 일


  • 작성중인 응용 프로그램에서 톱 페이지 (루트)에 사용자 등록 양식을 배치합니다.
  • root_path에 registrations_controller의 새로운 동작이 설정되었습니다.
  • 톱 페이지에는 사용자의 타임 라인 게시물이 표시됩니다

  • 톱 페이지 이미지


  • 상단 화면의 왼쪽에는 타임 라인이 표시됩니다
  • 오른쪽에는 사용자 등록 양식이 표시됩니다.


  • 처리 이미지




  • 검증에 걸린다거나 사용자 등록 실패시에 톱 페이지로 리디렉션하고 싶었다.
  • 긍정적 인 요구 사항으로 new 메소드를 중계하고 그리기를 원합니다 (new 메소드가 타임 라인을 얻는 프로세스를 담당하기 때문에).

    구현에 있어서의 과제


  • Device의 registrations_controller.rb를 처리 할 때 실패 할 때 어떤 페이지를 렌더링하거나 리디렉션 할지 모르겠습니다 (= 단지 조사가 부족합니다)

  • 해결 방법


  • registrations_controller.rb를 재정의하고 실패시 페이지 전환을 다시 작성하는 것이 었습니다.

    registrations_controller.rb의 create 메소드 처리


  • 원래의 create 메소드에서는 이런 처리를 하고 있었습니다
  • save 후 레코드가 존재하는지 처음 if 분으로 판정하고있다
  • 즉 코멘트 부분의 처리를 오버라이드(override) 해 주는 것으로 실현이 가능하게 된다고 생각했다

  • registrations_controller.rb
    def create
        build_resource(sign_up_params)
    
        resource.save
        yield resource if block_given?
        if resource.persisted?
          if resource.active_for_authentication?
            set_flash_message! :notice, :signed_up
            sign_up(resource_name, resource)
            respond_with resource, location: after_sign_up_path_for(resource)
          else
            set_flash_message! :notice, :"signed_up_but_#{resource.inactive_message}"
            expire_data_after_sign_in!
            respond_with resource, location: after_inactive_sign_up_path_for(resource)
          end
        else
          #登録失敗時の処理が記述されているっぽい場所
          clean_up_passwords resource
          set_minimum_password_length
          #登録失敗時のレスポンス処理
          respond_with resource
        end
      end
    
    

    재 작성 후 registrations_controller.rb의 create 메소드 처리


  • 마지막 respond_withredirect_to로 바꿨습니다.
  • 이렇게하면 new 메소드를 통해 톱 페이지가 다시 그려집니다.

    재기록 후 create 메소드
    def create
        build_resource(sign_up_params)
    
        resource.save
        yield resource if block_given?
        if resource.persisted?
          if resource.active_for_authentication?
            set_flash_message! :notice, :signed_up
            sign_up(resource_name, resource)
            respond_with resource, location: after_sign_up_path_for(resource)
          else
            set_flash_message! :notice, :"signed_up_but_#{resource.inactive_message}"
            expire_data_after_sign_in!
            respond_with resource, location: after_inactive_sign_up_path_for(resource)
          end
        else
          clean_up_passwords resource
          set_minimum_password_length
          #書き換えた部分
          redirect_to action: 'new', flash:{error:"ユーザ登録に失敗しました"}
        end
      end
    

    다음 과제


  • 현재는 밸리데이션 에러의 메세지를 건네주지 않기 때문에, 유저측에서는 어디가 잘못하고 있는지 모르는 불친절한 처리가 되고 있다
  • flash:{error: resource.errors.full_message} 처리가 잘못되었는지 확인합니다.

    요약


  • 장치의 처리를 사용자 정의하고 싶다면 github에서 코드를 보는 것이 가장 빠릅니다.
  • 좋은 웹페이지 즐겨찾기