我试着记下一个before_destroy回调,让用户在出发时间前至少2小时取消预订。
这是我到目前为止所写的内容
应用/模型/预订
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
通过这种方式,我只能取消出发前至少两小时的预订。 这是对的吗?
答案 0 :(得分:2)
验证仅在保存或更新和对象时发生,它不会阻止它们被删除。根据{{3}},只需从before_destroy
返回false即可停止操作。
所以试试:
def verify
if !ensure_deletable
false
end
end
答案 1 :(得分:2)
if !(:ensure_deletable)
不会调用您的ensure_deletable
方法。它会检查符号 :ensure_deletable
是nil
还是false
。这当然总是返回false
。
要调用您的方法,您必须写:
if !ensure_deletable
# ...
end
或
unless ensure_deletable
# ...
end
此外,您可能需要以noted by japed的形式从回调中返回false
。
答案 2 :(得分:2)
为什么不做呢
HttpRequestHandler