【发布时间】:2009-12-21 02:06:49
【问题描述】:
我有一个 Event 模型,其中包含一个 finish_time 字段和一个名为 whenever 的表单复选框。当whenever 被选中时,我想将finish_time 设置为nil,而不管它在参数中的值如何,当whenever 未被选中时,我想确保finish_time 是一个有效日期,然后再将其保存在数据库。
目前我正在使用whenever attr_accessor on Event:
params[:event][:finish_time] = nil if whenever = params[:event].delete(:whenever)
@event = Event.new(params[:event])
@event.whenever = whenever
如果whenever 是false,则使用条件验证来检查finish_time
validates_presence_of :finish_time, :unless => @whenever
我对这造成的重复不满意。 finish_time 可以是nil 的唯一方法是whenever 是true,如果您更改其中一个,则通常必须更改另一个。如果Event 更新为新的finish_time,则whenever 也必须更改为false。
理想情况下,我想将验证移至我的控制器。这样,在进行直接模型访问时,whenever 可以通过将finish_time 设置为null 来轻松指示,但是如果用户没有指示选择,发布到 /events 的用户会被骂。但是,我想不出一种方法来有条件地从控制器中添加或删除对Event 的验证,或者即使这是最好的方法。
删除这种重复的最佳方法是什么?
【问题讨论】:
标签: ruby-on-rails refactoring controller dry