[Rails]devise에서 생각하지 않는 검증 오류

6286 단어 Rails5루비devise

소개



유저 관리로 신세를 지고 있는 devise로 생각하지 않는 에러에 빠져, 상당한 시간을 녹였으므로 비망록으로서 남겨 둡니다.

환경/Gem(ver)


  • Ruby (2.5.1)
  • Rails (5.2.4.3)

  • 결론



    스스로 User 모델에 validates를 걸 때는 조심하자.

    제대로 아래 조사를 하고 향후 구현하도록 합니다. .

    전제



    devise 를 bundle install 후, 다음과 같이 User 모델에 밸리데이션을 걸고 있었습니다.
    password에는 7자 이상의 제한을 걸고 싶었습니다.

    이제 신규 사용자 등록은 문제 없었습니다.

    ※User와 Shop는 다대다의 관계로 중간 테이블에 Stylist 테이블이 있는 이미지로 구현하고 있습니다.
    (models/user.rb)
    class User < ApplicationRecord
      # Include default devise modules. Others available are:
      # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
      devise :database_authenticatable, :registerable,
             :recoverable, :rememberable, :validatable
    
      has_many   :stylists
      has_many   :shops, through: :stylists
    
      (省略)
    
      validates :password, presence: true, length: { minimum: 7 }, format: { with: /(?=.*\d+.*)(?=.*[a-zA-Z]+.*)./ }
    end 
    

    현상



    사용자(User 모델) 등록 후 신규로 숍(Shop 모델)을 작성과 동시에 중간 테이블(Stylist 모델)을 작성하려고 하면, 에러.



    파라미터에는 제대로 값이 들어가 있고, 무엇이 「부정한 값」인가, 그 원인이 찾아내지 못하고.
    또, 「신규 등록(new/create)은 할 수 없지만 편집(edit/update)은 할 수 있다」라고 하는 상황에서, 수수께끼가 깊어져, 많은 시간을 녹였습니다. .

    가설



    외래 키 nil을 허용하면 해결할 수 있습니까?
    (models/stylist.rb)
    class Stylist < ApplicationRecord
    #修正前
      belongs_to :shop
      belongs_to :user
    #修正後
      belongs_to :shop, optional: true
      belongs_to :user, optional: true
    end
    

    ...안돼요.

    해결책



    밸리데이션에 원인이 있는 것은 틀림없기 때문에, User 모델에 기술하고 있는 validates를 하나하나 해제하면서, 거동을 확인해 가면,
    (models/user.rb)
    class User < ApplicationRecord
    
      (省略)
    
      validates :password, presence: true, length: { minimum: 7 }, format: { with: /(?=.*\d+.*)(?=.*[a-zA-Z]+.*)./ }
    end 
    

    ↑ validates :password를 지우면 만사 해결이었습니다! !

    그리고, 아래의 장소에 커스터마이즈 내용을 재기록했습니다.
    (config/initializers/devise.rb)
    class User < ApplicationRecord
    
      (省略)
    
    #修正前
      config.password_length = 6..128
    #修正後
      config.password_length = 7..128
    

    원래 왜 중간 테이블을 저장할 때 오류를 내뿜는가? 수수께끼 그대로입니다만, devise에는 디폴트의 밸리데이션이 있어, 자작한 밸리데이션과 좋지 않은 반응을 했을까라고 생각합니다. . (공부합니다)

    또, 이하의 기사를 참고로 해, 커스터마이즈를 했는데 문제 없게 동작하고 있습니다!

    참고 기사



    htps : // 코 m / 히로키 헉 / / ms / 862284c60429 베 5 01cd
    htps : // 기주 b. 코 m / 헤아 rt 코 m 보 / / ゔ ぃせ / うぃき / 쿠 s와 미제 미무 m 파스 ぉ rd ぇ

    좋은 웹페이지 즐겨찾기