3

ActiveRecord トランザクションは初めてです。以下のコードでは、最初の update_attributes によって WARNING: Can't mass-assign protected attributes: account_type_cdx が発生し、問題ありません。しかし、次の行 self.update_attributes!(:purchased => true) が実行され、DB に格納されていることに驚きました。最初のものが失敗したため、ロールバックすることを期待していました。

私は何かが欠けているに違いない...ヒントはありますか?

def complete_purchase(current_user_id, plan_name)
    Rails.logger.debug "COMPLETE PURCHASE"
    user = User.find(current_user_id)
    ActiveRecord::Base.transaction do
        user.update_attributes!(:account_type_cdx => plan_name.to_sym)
        self.update_attributes!(:purchased => true)
    end
end

この投稿のアドバイスに従いました: http://markdaggett.com/blog/2011/12/01/transactions-in-rails/

ありがとう。

4

1 に答える 1

2

Railsは、クラス呼び出しで明示的にリストされていないレコードを無視しattr_accessibleます (したがって、最初の更新警告)。トランザクションは失敗しません。そのため、2 番目の update_attributes に到達 (および終了) します。通常は。

于 2012-10-30T21:30:05.060 に答える