Ruby on rails 如何仅在rails中编辑了另一个字段时验证该字段的存在?

Ruby on rails 如何仅在rails中编辑了另一个字段时验证该字段的存在?,ruby-on-rails,validation,Ruby On Rails,Validation,我有一个表,其中一列名为lifecycle\u id,另一列名为lifecycle\u change\u reason。lifecycle_id通常由系统基于其他因素自动更改,但某些用户可以手动更改生命周期。如果他们这样做了,我想要求他们提供更改的原因,但我不想在其他时间要求提供该字段。有人对我如何执行这种类型的验证有什么建议吗 thx:) -我可以看到两种不同的方式。我认为最好是在表中添加另一个名为lifecycle\u id\u original的字段。然后,您的模型将包含如下代码: cla

我有一个表,其中一列名为lifecycle\u id,另一列名为lifecycle\u change\u reason。lifecycle_id通常由系统基于其他因素自动更改,但某些用户可以手动更改生命周期。如果他们这样做了,我想要求他们提供更改的原因,但我不想在其他时间要求提供该字段。有人对我如何执行这种类型的验证有什么建议吗

thx:)


-我可以看到两种不同的方式。我认为最好是在表中添加另一个名为
lifecycle\u id\u original
的字段。然后,您的模型将包含如下代码:

class Member < ActiveRecord::Base
  belongs_to :lifecycle

  validates :lifecycle_change_reason, :if => :lifecycle_changed?

  before_save :reset_original_lifecycle

  protected

  def lifecycle_changed?
    self.life_cycle_id != self.lifecycle_id_original && !self.lifecycle_id_original.nil?
  end

  def reset_original_lifecycle
    self.lifecycle_id_original = self.lifecycle_id
  end
end
类成员:生命周期\u更改?
保存前:重置原始生命周期
受保护的
你改变了什么?
自我生命周期id!=self.lifecycle\u id\u原件&&!self.lifecycle\u id\u original.nil?
结束
def重置_原始_生命周期
self.lifecycle\u id\u original=self.lifecycle\u id
结束
结束
验证对象(本例中的成员)时,仅当原始id和生命周期id不相同时,才需要生命周期更改原因。原始记录也允许使用nil值,因为新创建记录时将使用nil值

然后在保存时,将“原始”设置为与生命周期id匹配,以便下一个更新周期正常工作


这不像我想要的那么干净。我的第一个想法是使用
attr\u访问器
,这样副本就不会一直存储在数据库中,但这意味着每次加载记录时都要设置该值。我不知道ActiveRecord模型有任何加载式回调。

这似乎就是控制器的用途。我意识到人们想要将逻辑推送到模型上,这是有充分理由的,但让我们务实一点:如果您的系统自动更改此值,并且在您的系统中只有一个点可以手动更改,在我看来,它不会,引入这么多的复杂性,以简单的方式强制控制器中存在一个原因,如:

if params[:object_name][:life_cycle_id] != @object.life_cycle_id && params[:object_name][:life_cycle_change_reason].blank?
   flash[:error] = "You must enter a reason for changing the life cycle."
   redirect_to :back and return false # or whatever
end

问题是你没有在表单中得到所有好的验证错误处理。当然你也知道如何做到这一点:@object.errors.add(:life\u cycle\u change\u reason,“必须提供”)很简单。