如何修复此 before_destroy 回调 [rails]

How to fix this before_destroy callback [rails]

我试着写了一个 before_destroy 回调,它应该让用户至少在出发时间前 2 小时取消预订。

这是我到目前为止所写的

app/model/reservation

class Reservation < ActiveRecord::Base 

  before_destroy :verify


  private
  def verify
     if !(:ensure_deletable)
       record.errors[:base] << 'error'
     end
   end

  def ensure_deletable
    if self.date_trip.to_time < Time.now + 2
      return true
    end 
   end 
end

此代码没有给我任何错误,但它确实允许用户随时取消预订..

你能帮帮我吗?谢谢

编辑:

感谢您的回答,我修改了下面的代码。

class Reservation < ActiveRecord::Base

  before_destroy :verify

  belongs_to :dep ,:class_name => 'Stop', :foreign_key => 'dep_id'
  belongs_to :arr ,:class_name => 'Stop',:foreign_key => 'arr_id'
  belongs_to :route
  belongs_to :user
  delegate :CountStop, :to => :route, prefix: true, :allow_nil => false
  delegate :city ,:to => :arr, :allow_nil => false
  delegate :city ,:to => :dep, :allow_nil => false



def verify
  if ensure_deletable
    false
  end
end    


private
def ensure_deletable
   if self.date_trip.to_time < Time.now + 2
     return true
   end
end


end

这样我就可以只取消离出发至少两个小时的预订了。 这是正确的吗?

验证仅在保存或更新对象时发生,不会阻止它们被删除。根据 APIdock 的说法,只需从 before_destroy 返回 false 就会停止执行操作。

所以尝试:

def verify
  if !ensure_deletable
    false
  end
end

if !(:ensure_deletable) 不会调用您的 ensure_deletable 方法。它检查 符号 :ensure_deletablenil 还是 false。这当然总是 return false.

要调用您的方法,您必须编写:

if !ensure_deletable
  # ...
end

unless ensure_deletable
  # ...
end

此外,您可能必须 return false 来自您的回调

为什么不直接做

class Reservation < ActiveRecord::Base 

  before_destroy :ensure_deletable

  private

  def ensure_deletable
    # can be deleted up to two hours before time
    deletable = Time.now + 2.hours < self.date_trip.to_time
    record.errors << 'Reservation can no longer be deleted' unless deletable 
    deletable
  end 

end