ruby-on-rails - ActiveRecord 事务没有回滚整个事务

标签 ruby-on-rails ruby activerecord transactions

我有一个票模型,用户可以从给定的序列号开始连续购买票。用户选择他们想要购买的门票数量, Controller 生成该数量的门票并存储在数据库中。但是,如果一张票未能保存,事务应该回滚,但在这种情况下不会。

tickets_controller.rb

...
def create
  number = params[:ticket_qty].to_i
  @tickets = Array.new
  number.times do |n|
    t = Ticket.new(ticket_params)
    t.serial_number = t.serial_number.to_i + n 
    @tickets.push(t)
  end

  respond_to do |format|
    ActiveRecord::Base.transaction do 
      @tickets.each do |t| 
        if t.save
          format.html { redirect_to tickets_path, notice: "#{number} #{"ticket".pluralize(number)} successfully created." }
          format.json { render :show, status: :created, location: tickets_path }
        else
          format.html { render :new, notice: "Some tickets have errors, check the serial number range" }
          format.json { render json: @ticket.errors, status: :unprocessable_entity }
        end
      end
    end
  end
end
...

重定向也正确,但没有显示任何通知。

最佳答案

要在出现错误时回滚事务,请将 t.save 替换为 t.save!

这会导致:

respond_to do |format|
  begin 
    ActiveRecord::Base.transaction do 
      @tickets.each &:save!
      format.html { redirect_to tickets_path, notice: "#{number} #{"ticket".pluralize(number)} successfully created." }
      format.json { render :show, status: :created, location: tickets_path }
    end
  rescue ActiveRecord::ActiveRecordError => e
    format.html { render :new, notice: "Some tickets have errors, check the serial number range" }
    format.json { render json: e.message, status: :unprocessable_entity }
  end
end

关于ruby-on-rails - ActiveRecord 事务没有回滚整个事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25886262/

相关文章:

html - Bootstrap Navbar 以非常奇怪的形式显示

ruby - 使用带有方括号的 Array#shift (Ruby)

ruby-on-rails - 事件记录复杂连接

ruby-on-rails - 如何在 Rails 3 中为 "extra description"的数据类型生成脚手架?

ruby-on-rails - ruby /rails : how can I create multiple records in salesforce with one API call via the rforce gem?

ruby-on-rails - 在 Ruby 中,将非常大的局部变量复制到实例变量会重复内存需求

ruby-on-rails - rails : How to disable ActiveStorage Analyzers and Previewers

ruby - 如何证明 Ruby `for` 循环实际上是使用 `each` 方法实现的?

ruby-on-rails - Bundler 使用错误的 Ruby 版本

ruby-on-rails - 在 Rails 3 模型中创建命名关系