16
validate :updatable?  # First validation there is
with_options :if => Proc.new { |object| object.errors.empty? } do |updatable|
    updatable.with_options :if => "self.current_step == basic" do |step|
        validates .... bla-bla bla

したがって、検証が行われる前に、更新可能なサブルーチンが呼び出され、errors[:base]適切なエラーが配列に入力されます。つまり、オブジェクトは更新可能ではありません。そして、このサブルーチンでエラーが見つかった場合は残りの検証をスキップしたかったのですが、上記の例は機能していません- すべての検証を実行します。

しかし、私が変更:if => "self.current_step == basic"する:if => "self.errors.empty? && self.current_step == basic"と、魅力のように機能します。

私が間違っていることは何ですか?例は、ネストされたものが機能することを示していwith_optionます。

誰かが私を助けることができますか?前もって感謝します。

4

1 に答える 1

24

2 つの :if 条件をネストすると、内側の条件が外側の条件に置き換わり、常にチェックされることは間違いありません。2 レベルのネストを処理するための回避策は次のとおりです。

with_options :unless => !(outer condition) do
  with_options :if => (inner condition) do

if 条件と until 条件は互いに上書きしません。これをバグと呼ぶかどうかはわかりませんが、複数の :if 条件をネストできると便利です。

于 2013-03-13T14:28:52.547 に答える