【Rails】update 액션이 통과하지 않는 이유를 잘못 검증해 온 이야기(update)

1. 하고 싶은 일



gem devise를 이용하여 유저 등록(명칭은 owner로 하고 있다) 기능을 실장 완료.
비밀번호를 입력하지 않고 등록된 데이터를 편집하려고 하는 것도 에러가 일어나, 그 해결에 쓸데없이 상당히 고민해 버린 이야기.

2. 실행 환경



Ruby 2.6.5
Rails 6.0.3

3. 전제로 만들어진 준비



devise 측의 사양에 따라 다음 두 가지 준비가 필요했습니다.
①account_update시에 디폴트 컬럼 이외의 컬럼의 값을 허용한다(sanitizer)
②password 없이 업데이트를 허용한다.

공식 여기 라든지 여기 의 기사를 보면 할 수 있을까 생각합니다. Qiita도 조사하면 가득 있을 것입니다.

이것들은 할 수 있었는데 이하와 같이 왜인지 잘 업데이트 보존을 할 수 없고, devise의 사양 때문인가・・・? 라고 괴롭히고 고민하는 것에.



위의 에러 검증을 하고 있고 나는 이하와 같이 고민하고 있었던 것이었습니다.

1.ArgumentError given 0~이 되어 있으므로, 원래 괜찮은 인수가 건네받지 않은 것은? (하지만 params는 제대로 다니고 있습니다 ...)
2. 에러 메세지가 패스워드라고 하는 것은, 역시 devise의 패스워드 없음 갱신이 잘 되어 있지 않은 것은 아닌가?

4. 결론



비밀번호 유효성 검사가 걸려서 오류가 발생했습니다.

owner.rb
class Owner < ApplicationRecord

  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

  validates :name, presence: true
  validates :email, presence: true, uniqueness: true, format: { with: VALID_EMAIL_REGEX}
  validates :password, presence: true, confirmation: true, length: { minimum: 7 }

  has_many :shops
end


상기 모델의 밸리데이션이 update시에도 걸려 있어, 그래서 에러가 나온 형태입니다.
잘 생각하면 밸리데이션으로 설정한 에러 메세지가 출력되고 있기 때문에 당연하네요, 원래.

그래서

owner.rb
class Owner < ApplicationRecord

  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

  validates :name, presence: true
  validates :email, presence: true, uniqueness: true, format: { with: VALID_EMAIL_REGEX}
  validates :password, presence: true, confirmation: true, length: { minimum: 7 },on: :create

  has_many :shops
end


이런 식으로 패스워드의 밸리데이션을 create시만의 설정으로 해 주면 해결했습니다.

5. 진흙 늪에 빠진 실수





방금 전의 binding.pry시의 에러 메세지에 대해서, 나는 여기서 인수가 잘 되지 않았다고 생각하고 있었습니다만, 그 인식이 원래 잘못하고 있어서.

controller의 update 액션으로 제대로 인수가 건너온 후에, 디버그 화면에서 한번 더 update를 실행하고 있는군요, 이것이라고.
그래서 제가 이 화면에서 했던 update에는 인수가 지정되어 있지 않기 때문에, 그럼 인수 없어라는 오류가 일어나고 있을 뿐입니다.

이 흐름을 제대로 이해할 수 있어 좋지 않기 때문에 끝난 실수였습니다 ... 반성.

좋은 웹페이지 즐겨찾기