Ruby on rails 使用参数控制Rails验证

Ruby on rails 使用参数控制Rails验证,ruby-on-rails,refactoring,controller,dry,Ruby On Rails,Refactoring,Controller,Dry,我有一个事件模型,其中有一个完成时间字段和一个名为的表单复选框。当无论何时选中时,我都希望将完成时间设置为nil,而不管其在参数中的值如何;当无论何时未选中时,我都希望在将其保存到数据库之前,确保完成时间是有效日期 目前,我正在使用事件上的属性访问器来实现这一点: params[:event][:finish_time] = nil if whenever = params[:event].delete(:whenever) @event = Event.new(params[:event])

我有一个
事件
模型,其中有一个
完成时间
字段和一个名为
的表单复选框。当
无论何时选中
时,我都希望将
完成时间
设置为
nil
,而不管其在参数中的值如何;当
无论何时未选中
时,我都希望在将其保存到数据库之前,确保
完成时间
是有效日期


目前,我正在使用事件上的
属性访问器来实现这一点:

params[:event][:finish_time] = nil if whenever = params[:event].delete(:whenever)
@event = Event.new(params[:event])
@event.whenever = whenever
并使用条件验证检查
finish\u time
是否
只要
false

validates_presence_of :finish_time, :unless => @whenever

我对这造成的重复感到不满意。
finish\u time
可以是
nil
的唯一方法是如果
无论何时
true
,如果您更改一个,您通常必须更改另一个。如果使用新的
finish\u time
更新
事件
,则无论何时
都必须更改为
false

理想情况下,我希望将验证转移到我的控制器。通过将
finish_time
设置为
null
,可以方便地指示何时进行直接模型访问
,但如果用户没有指示选择,则会对发布到/事件的用户大喊大叫。但是,我无法找到一种方法来有条件地从控制器中添加或删除对
事件的验证,即使这是最好的方法


消除重复的最佳方法是什么?

您可以尝试用“Ruby方式”来解决问题,而不是通过验证来解决问题

除了验证之外,您可能还想钩住
finish\u time
where
方法的变异子

class Event < ActiveRecord::Base
  # Validate presence
  validates_presence_of :finish_time, :unless => @whenever

  def whenever=(yes)
    write_attribute(:whenever, yes)
    write_attribute(:finish_time, nil) if yes?
  end
  def finish_time=(time)
    write_attribute(:whenever, false)
    write_attribute(:finish_time, time)
  end
end
编辑:但是,这将使结果字段取决于分配顺序,因此,如果分配顺序发生变化,相同参数集的结果可能会不同。那不可能是你想要的。所以你必须按照你想要的方式调整你的操纵器

你也应该明白,除非你把你的需求弄干了,否则你就不能把你的代码弄干


< > > > >编辑> 2:< /强>我认为您应该考虑将< <代码> FixSimeTime/COD>的要求“<代码> nIL/COD> >如果<代码>每当设置为true。然后,您可以按照上述相同的方式修改访问器。

保持我的需求干燥的好处。也许有一些日期值不是空的,可以表示“不在乎”而不是空的?我认为问题在于让一个价值意味着两件事。我想不出有什么办法不使用魔法数字。这很有道理。谢谢
@event = Event.new(params[:event])