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])