state_machineを使用しているときに、Railsモデルで検証例外を実行する正確な方法を見つけることができませんでした。
モデルに状態列を期待どおりに設定し、ユーザーを未確認から確認済みに渡すことでメールの検証を処理します。これは非常に簡単です。
私のモデルには、パスワードの通常の検証が含まれています
validates :password, length: {minimum: 6}
validates :password_confirmation, presence: true
この検証は重要ですが、ユーザーを未検証の状態から検証済みの状態に渡すと、単一の列に更新を適用するだけなので、モデルの検証で問題が発生しますが、state_machineとのアクティブなレコード統合はレコードの更新を適用するようです。
state_machineスニペット:
state_machine :initial => :unverified do
event :verify do
transition :unverified => :verified
end
したがって、ソリューションはモデルの検証に例外を適用しているように見えますが、ソリューションとしての場合を除いて、私は:に惹かれました。
完全には理解していないと言わざるを得ないことを実装しました。これにより、パスワードの検証が削除され、明らかにstate_machineプロセスが機能するようになりますが、目的は達成されません。
追加する場所の変更:
validates :password, length: {minimum: 6}, :unless => :proc_no_password_validation
validates :password_confirmation, presence: true, :unless => :proc_no_password_validation
プライベートメソッドで適用します。
def proc_no_password_validation
Proc.new { |user| user.verify }
end
私は方向的に正しい方向に進んでいると感じていますが、私の間違いや問題、または他の解決策を見つけるのを手伝っていただければ幸いです。
更新それで私はこれに関してJefからいくらかの助けを得ました、しかし私の結論はモデル検証メソッドの例外ルートが間違っていたということでした、私は次のように私の状態コードを修正しました:
state_machine :state, :initial => :unverified, :action => :bypass_validation do
event :verify do
transition :unverified => :verified
end
event :unverify do
transition :verified => :unverified
end
end
そして、私が無視したい状態の検証バイパス
def bypass_validation
if self.changes['state'][1] == 'verified'
save!(:validate => false)
else
save!(:validate => true)
end
end