私はacts_as_nested_set
フォークを使用するモデルを持っています。モデルを保存し、そのノードを1つのトランザクションでセットに移動する方法をモデルに追加しました。このメソッドは、検証メソッドを呼び出して、trueまたはfalseを返す移動が有効であることを確認します。検証に失敗した場合は、保存メソッドをActiveRecord::Rollback
にしてトランザクションをロールバックし、呼び出し元にfalseを返すようにします。ActiveRecord :: Rollback例外を発生させ、値を一緒に返すにはどうすればいいですか?
私のモデルは次のようになります。私は失敗するような状況でsaveを呼び出すとき
class Category < ActiveRecord::Base
acts_as_nested_set :dependent => :destroy, :scope => :journal
def save_with_place_in_set(parent_id)
Category.transaction do
return false if !save_without_place_in_set
if !validate_move parent_id
raise ActiveRecord::Rollback and return false
else
place_in_nested_set parent_id
return true
end
end
end
alias_method_chain :save, :place_in_set
def validate_move(parent_id)
# return true or false if the move is valid
# ...
end
def place_in_nested_set(parent_id)
# place the node in the correct place in the set
# ...
end
end
しかし、トランザクションがロールバックされますが、機能がnil
を返します。
>> c = Category.new(:name => "test")
=> #<Category id: nil, name: "test" parent_id: nil, lft: nil, rgt: nil>
>> c.save_with_place_in_set 47
=> nil
>> c.errors.full_messages
=> ["The specified parent is invalid"]
+1、私が来たのと本質的に同じ結論。 –
感謝します! Rails 3.2.8で有効です。 [ドキュメント](http://api.rubyonrails.org/classes/ActiveRecord/Rollback.html)から、 'raise ActiveRecord :: Rollback'がトランザクションの終了後に行にジャンプすることは私には明らかではありませんでした。ロールバックは実際にはプログラムの流れを全く中断しないように、ちょうど落ちているように見えました。 –