2009-12-21 20 views
2

我有一个Event模型与finish_time场,并呼吁whenever形式复选框。当whenever被选中我想在参数设置finish_timenil不管它的价值,当whenever不检查我想确保finish_time是一个有效的日期之前,我将它保存在数据库中。使用参数来控制导轨验证


目前我使用的事件whenever attr_accessor实现这一点:

params[:event][:finish_time] = nil if whenever = params[:event].delete(:whenever) 
@event = Event.new(params[:event]) 
@event.whenever = whenever 

和使用条件的验证检查finish_time如果wheneverfalse

validates_presence_of :finish_time, :unless => @whenever 

我不满意这个重复eates。 finish_time可以是nil的唯一方法是如果whenevertrue,并且如果您更改了一个,则经常需要更改另一个。如果Event更新为新的finish_time,则whenever也必须更改为false

理想情况下,我想将验证移动到我的控制器。做直销模式进入whenever时,这样可以通过设置finish_timenull很容易地表示,但用户张贴到/事件将在如果他们没有表示的选择得到喊道。但是我无法想出一种方法来有条件地向控制器添加或删除Event的验证,或者即使这是最好的方法。

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

回答

1

,而不是试图解决通过验证的问题,你可以尝试解决这一问题的“Ruby的方式。”

除了验证之外,您可能还想勾选finish_timewhenever方法的变体。

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 

然后,你可以试试(但是,我不知道它是否有效):

@event = Event.new(params[:event]) 

编辑:然而,这将使合成领域看订单assignemnts发生,因此如果赋值顺序改变,相同参数集的结果可能会有所不同。这不太可能是你想要的。所以你必须按你想要的方式调整你的运营商。

而且你也应该明白,你不能让你的代码干,除非你让你的要求干的。

编辑#2:我想你应该考虑删除的要求为finish_timenil如果whenever设置为true。然后您可以按照上述相同的方式修改访问器。

+0

关于保持我的要求干的好点。也许有一些日期值不是null可能表示“不关心”而不是空的?我认为问题来自于创造一个价值意味着两件事。我想不出有什么办法可以求助于魔法数字。 – maxhawkins 2009-12-21 02:37:49

+0

编辑答案需要建议 – 2009-12-21 02:45:33

+0

这很有道理。谢谢! – maxhawkins 2009-12-21 02:49:23