如何修复此 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_deletable
是 nil
还是 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
我试着写了一个 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_deletable
是 nil
还是 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