【Devise】must exist의 대처법

이런 분들에게


  • Rails에서 포트폴리오 생성 중
  • devise 도입
  • must exist 오류가 발생합니다

  • Too Long, Didn't Read


    application_controller.rb 에 부분적으로 strong parameter를 써서 해결

    환경


  • MacOS Big Sur v11.2.1
  • Ruby 2.6.5
  • Rails 6.0.3.2

  • 신규 등록에 필요한 정보



    User 모델을 다음 명령으로 만듭니다.

    terminal
    $ rails g devise User
    

    다양한 파일이 생성되지만, 그 안에 있는 마이그레이션 파일을 확인해 보겠습니다.

    migrate/timestamp_devise_create_users.rb
    # frozen_string_literal: true
    
    class DeviseCreateUsers < ActiveRecord::Migration[5.2]
      def change
        create_table :users do |t|
          ## Database authenticatable
          t.string :email,              null: false, default: ""
          t.string :encrypted_password, null: false, default: ""
    
          ## Recoverable
          t.string   :reset_password_token
          t.datetime :reset_password_sent_at
    
          .
          .
          .
    
        end
     end
    

    Database authenticable에서 볼 수 있듯이 기본적으로 인증에 email과 password가 필요하다는 것을 알 수 있습니다.

    인증에 name도 필요하고 싶기 때문에 다음의 커멘드로 users 테이블에 string형의 name 컬럼을 추가합니다.

    terminal
    $ rails g migration AddNameToUsers name:string
    

    마이그레이션 파일이 생성되므로 다음 명령으로 데이터베이스에 반영합니다.

    terminal
    $ rails db:migrate
    

    이것으로 name 컬럼도 추가할 수 있었고, 밸리데이션과 폼을 확실히 설정! !



    계정 등록!



    응?

    분명히 name이 must exist라는 것.
    이름을 입력하는 데 값이 없다는? 라는 느낌이지만 여기서 strong parameter의 존재를 기억한다.

    devise를 사용하기 전까지는 신규 등록등의 기구를 담당하는 컨트롤러에 프라이빗 메소드로서 기술하고 있던 기억이 있었으므로, 그것을 따라 컨트롤러를 들여다 본다.

    controllers/users/registrations_controller.rb
      . 
      .
      .
      # If you have extra params to permit, append them to the sanitizer.
      # def configure_account_update_params
      #   devise_parameter_sanitizer.permit(:account_update, keys: [:attribute])
      # end
      .
      .
      .
    

    그것 같은 설명은 있었지만 모두 코멘트 아웃되어 있어 어떤 것! ? 라는 느낌이었기 때문에 devise의 Github를 보면 이런 설명이 있었다.


    참고 : heartcombo/devise

    요점은 application_controller.rb 에 부분적으로 strong parameter를 써 주면 좋다.

    controllers/application_controller.rb
    class ApplicationController < ActionController::Base
      before_action :configure_permitted_parameters, if: :devise_controller?
      # ↑も記述
    
      protected
    
      def configure_permitted_parameters
        added_attrs = [:name] #追加したparams
        devise_parameter_sanitizer.permit :sign_up, keys: added_attrs
      end
    end
    
    

    이걸로 다녔어,,,



    야타네!

    좋은 웹페이지 즐겨찾기