0

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
4

1 に答える 1

1

:unlessメソッド名をシンボルまたはプロシージャとして受け入れます。Procを返すメソッドの名前を指定しました。Procはfalseではないため、条件が満たされ、検証がスキップされない限り、

次のいずれかを使用する必要があります:

validates :password_confirmation, presence: true, :unless => :proc_no_password_validation
 def proc_no_password_validation
   self.verify
 end

validates :password_confirmation, presence: true, :unless => Proc.new{|user| user.verify}

アップデート

state_machineを使用すると、検証を状態にラップできます。

state :unverified { # or :verified, when should validation apply ?
  validates :password ...
  validates :password_confirmation ...
}
于 2012-12-28T14:12:20.543 に答える