我的注册表格复杂而且脆弱。我正在尝试使用事务,但它似乎不像我认为的那样工作。
如果某些内容失败,我的目的是回滚所有存档。我做错了吗?
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
我还没有测试过这段代码,所以它可能会有错误。请尝试一下,如果有效,请给我们反馈,如果没有,请给我们反馈。
希望这有帮助!
快乐编码:)