使用事务回滚保存

时间:2015-12-22 21:41:37

标签: ruby-on-rails transactions

我的注册表格复杂而且脆弱。我正在尝试使用事务,但它似乎不像我认为的那样工作。

如果某些内容失败,我的目的是回滚所有存档。我做错了吗?

if @little_class_schedule.valid?
  User.transaction do
    if @user.save
      @little_class.user_id = @user.id
      if @little_class.save
        if @location.save
          if little_class_schedule_form_params["schedule_type"].to_i == 2 || @little_class_schedule.save
            if @little_class_session_validation.valid?
              sessions.each do |s|
                if s.save
                  next
                else
                  raise ActiveRecord::Rollback
                  render 'class_account_registration/new'
                end
              end
              ApprovalMailer.request_approval(@user, @little_class).deliver
              redirect_to dashboard_path, notice: 'Success!'
            else
              raise ActiveRecord::Rollback
              render 'class_account_registration/new'
            end
          else
            raise ActiveRecord::Rollback
            render 'class_account_registration/new'
          end
        else
          raise ActiveRecord::Rollback
          render 'class_account_registration/new'
        end
      else
        raise ActiveRecord::Rollback
        render 'class_account_registration/new'
      end
    else
      render 'class_account_registration/new'
    end
  end
else 
  render 'class_account_registration/new'
end

1 个答案:

答案 0 :(得分:0)

我强烈建议您在代码中获取结构并保持干燥!

由于我不知道你想做什么,我只是改进了你的代码。它仍然不是最好的解决方案,但由于我不知道你真正想做什么,我无法改变逻辑。

successful = false

if @little_class_schedule.valid?
    User.transaction do
        if @user.save
            @little_class.user_id = @user.id

            if @little_class.save && @location.save
                if little_class_schedule_form_params["schedule_type"].to_i == 2 || @little_class_schedule.save
                    if @little_class_session_validation.valid?
                        sessions.each do |s|
                            if s.save
                                next
                            else
                                raise ActiveRecord::Rollback
                            end
                        end

                        successful = true
                    end
                end
            end
        end

        unless successful
            raise ActiveRecord::Rollback
        end
    end
end

if successful
    ApprovalMailer.request_approval(@user, @little_class).deliver_now
    redirect_to dashboard_path, notice: 'Success!'
else
    render 'class_account_registration/new' unless successful
end

我还没有测试过这段代码,所以它可能会有错误。请尝试一下,如果有效,请给我们反馈,如果没有,请给我们反馈。

希望这有帮助!

快乐编码:)