저는 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! 암호가 너무 짧습니다. 이 문제를 해결하는 방법에 대한 제안이 있습니까?