Rails / ActiveRecord:如果未选中复选框,则将datetime设置为null

时间:2011-02-07 21:46:02

标签: ruby-on-rails ruby

我的帖子中有一个可选的“expire_at”日期时间。

我正在尝试从我的表单中保存此日期时间如果选中“custom_expire_at”复选框。如果未选中,则日期时间应设置为NULL。

如果复选框值不存在,我已尝试删除expire_at参数:

# Delete expiration dates if box is not checked
if params[:item][:custom_expire_at]
  params[:item].delete(:custom_expire_at)
else
  params[:item].delete(:expire_at)
end

但是,expire_at是多参数:

"expire_at(1i)"=>"2011", "expire_at(2i)"=>"2", "expire_at(3i)"=>"10", "expire_at(4i)"=>"21", "expire_at(5i)"=>"32"

试图避免通过jQuery完全破坏这个日期时间选择 - 更倾向于将其从params中删除。

总结: 1)如果我不想要它们,我该如何去除这些参数? 2)即使我设法剥离expire_at,我也不知道如何将值设置回NULL。如果我将expire_at设置为nil,我的模型将忽略更新。

  def ensure_expire_at_has_a_value
    self.expire_at ||= nil
  end

有什么想法吗?提前谢谢!

2 个答案:

答案 0 :(得分:2)

要绕过多参数,您可以使用delete_if删除所有expire_at参数:

params.delete_if{ |key, value| key.match(/^expire_at/) }

答案 1 :(得分:0)

我建议你在你的模型中这样做。为attr_accessor创建custom_expire_at。确保您的表单已连接到它。然后,创建一个执行此操作的before_validation方法:

self.expire_at = null if custom_expire_at!='1'

顺便说一句,你正在检查'1',因为这是复选框发回的内容。