2015-12-22 7 views
-1

Моя регистрационная форма сложная и хрупкая. Я пытаюсь использовать транзакцию, но, похоже, она работает не так, как я думаю.Использование транзакции для отката сохраняет

Мое намерение состоит в том, чтобы откатить все сохраненные данные, если что-то не сработает. Я делаю это неправильно?

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 
+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 

Я не тестировал этот код, чтобы он мог иметь ошибки. Пожалуйста, попробуйте его и сообщите нам, если он работает, или если нет, то какие у вас ошибки.

Надеюсь, это поможет!

Счастливое кодирование :)