如何修复这个before_destroy回调[rails]

时间:2015-09-08 08:48:42

标签: ruby-on-rails ruby callback

我试着记下一个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

通过这种方式,我只能取消出发前至少两小时的预订。 这是对的吗?

3 个答案:

答案 0 :(得分:2)

验证仅在保存或更新和对象时发生,它不会阻止它们被删除。根据{{​​3}},只需从before_destroy返回false即可停止操作。

所以试试:

def verify
  if !ensure_deletable
    false
  end
end

答案 1 :(得分:2)

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

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

if !ensure_deletable
  # ...
end

unless ensure_deletable
  # ...
end

此外,您可能需要以noted by japed的形式从回调中返回false

答案 2 :(得分:2)

为什么不做呢

HttpRequestHandler