Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 验证失败时,创建不会回滚_Ruby On Rails_Validation - Fatal编程技术网

Ruby on rails 验证失败时,创建不会回滚

Ruby on rails 验证失败时,创建不会回滚,ruby-on-rails,validation,Ruby On Rails,Validation,控制器中的方法代码(reservations\u Controller.rb): 型号中的代码(reservation.rb): validate:timeValidation,on::create 验证:时间验证,on::update def时间验证 如果expect_start_timetime.now+7天 错误。添加(:expect\u start\u time,“应该在7天之内”) elsif expect_return_time

控制器中的方法代码(reservations\u Controller.rb):

型号中的代码(reservation.rb):

validate:timeValidation,on::create
验证:时间验证,on::update
def时间验证
如果expect_start_timetime.now+7天
错误。添加(:expect\u start\u time,“应该在7天之内”)
elsif expect_return_time
在函数中,当执行@reservation.save时,将调用reservation模型中的验证函数。我希望当验证失败时,Reservation.create(Reservation_params)会回滚。然而,实际情况是这样的:


@reservation.save之前,已提交创建。但是我有
validate:timeValidation,on::create
。它应该会后退。为什么?

发生这种情况是因为您同时添加了以下两项:

validate :timeValidation, on: :create
validate :timeValidation, on: :update
多次调用验证将覆盖以前的验证,请参阅

如果要对创建和更新事件执行验证,只需执行以下操作:

validate :timeValidation

同时执行
Reservation.new
而不是
Reservation.create
为什么要使用create创建@Reservation并再次调用save?????

改变方法如下

def create_reserve
  @reservation = Reservation.new(reservation_params)   // change to new
  ...
  if @reservation.valid? && @reservation.save          // check if its valid?
    ....
  end
end
如果问题仍然存在,请尝试以下操作

validate :timeValidation
def create_reserve
  @reservation = Reservation.new(reservation_params)   // change to new
  ...
  if @reservation.valid? && @reservation.save          // check if its valid?
    ....
  end
end
validate :timeValidation, on: :create
validate :timeValidation, on: :update
def timeValidation
  ...
  ...
  throw(:abort) if errors.present?        // raise error if error present.  
end