2

저는 Michael Hartl의 레일 튜토리얼을 따라 왔으며 Signup confirmation에 제안 된 확장 프로그램을 사용하여 사용자가 전자 메일 링크를 클릭하여 계정을 활성화하도록했습니다. 활성화를 관리하려면 state_machine gem을 사용하고 있지만 사용자 계정을 활성화하려고하면 "상태를 전환 할 수 없습니다 : 활성화 : 보류 중 (이유 : 비밀번호가 너무 짧습니다 (최소 6 자)) ". 나에게 state_machine이 상태 필드를 업데이트하기 위해 구현중인 데이터베이스 작업이 사용자 레코드 (가능하면 has_secure_password 메서드와 연결됨)와 연관된 유효성 검사를 유발하여 실패하게하는 것처럼 보입니다. 나는 1 년 전에 또 다른 stackoverflow 질문 here을 보았지만 그 질문에 대한 의견을 읽는 것은 해결책이 아닌 것 같습니다.레일 state_machine 전환으로 인해 비밀번호 확인 오류가 발생합니다.

내 사용자 모델 (user.rb) 코드는 아래에 있습니다 (기본적으로 Listing 6.29의 튜토리얼 코드와 상태 시스템이 추가되었습니다). [! 죄송합니다, 유래 나에게 2 개 이상의 링크를 허용하지 않습니다로 연결되는 링크를 제공 할 수 없습니다]

class User < ActiveRecord::Base 
    validates :name, presence: true, length: { maximum: 50 } 
    VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/i 
    validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, 
    uniqueness: { case_sensitive: false } 
    before_save { email.downcase! } 
    validates :password, length: { minimum: 6, maximum: 50 } 
    has_secure_password 
    before_create :create_remember_token 

    state_machine initial: :pending do 
    state :pending, value: 0 
    state :active, value: 1 

    event :activate do 
     transition :pending => :active 
    end 

    event :deactivate do 
     transition :active => :pending 
    end 
    end 

    def initialize 
    super() 
    end 

내 데이터베이스 사용자 테이블 구조는 다음과 같습니다 레일에서

create_table "users", force: true do |t| 
t.string "name" 
t.string "email" 
t.datetime "created_at" 
t.datetime "updated_at" 
t.string "password_digest" 
t.string "remember_token" 
t.boolean "admin",   default: false 
t.string "token" 
t.integer "state" 
end 

는 state_machine 코드가 보인다 콘솔 사용자 레코드를 얻을 수 있고 user.can_activate 할 때 데이터베이스의 값을 해석하는 것이 좋습니다. user.can_deactivate? 내가 기대하는 바를 돌려주고있다. 하지만 user.activate 할 때! 또는 user.deactivate! 암호가 너무 짧습니다. 이 문제를 해결하는 방법에 대한 제안이 있습니까?

답변

1

state_machine을 제거하고 데이터베이스의 상태 필드를 직접 업데이트하기 위해 코드를 변경하여 이에 대한 대답을 발견했습니다. 그런 다음 사용자 기록의 모든 업데이트로 인해 암호 유효성 검사가 트리거되고 암호 길이 오류가 표시됩니다 (따라서 state_machine에는 문제가 없음). 즉, state_machine 기능의 작동을 변경하면

validates :password, length: { minimum: 6, maximum: 50 }, :if => :validate_password? 
def validate_password? 
    password.present? || password_confirmation.present? 
end 

: 으로이 솔루션은 암호에 위의 "유효성"라인을 변경하여 업데이트되는 속성 중 하나가 아닌 경우 발생 암호 유효성 검사를 방지하는 것입니다 here 설명 벌금.