如果勾选复选框,如何保存记录?

时间:2014-07-01 12:53:27

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4

我的模型名为Item,字段为:

发货(布尔),达到(布尔值),发货日期(日期)和达到日期(日期)

视图中的已装货和已到达字段是复选框。

现在,当我在Item模型中添加新记录时,如果shipped_at和{{reached_at,我希望shipped日期字段和reached日期字段为零1}}未选中复选框。如果只选择了其中一个,我希望存储该特定日期。

为了实现这一点,我在我的模型中创建了before_save过滤器:

class Item < ActiveRecord::Base
  before_save :dates_defaults

 def dates_defaults

  if(shipped = 0 || reached = 0) 
  self.shipped_at = nil || self.reached_at = nil
  end
    end
   end

如果未勾选复选框,则此工作正常。但是当它们存在时,日期字段仍为零。

我是否需要在dates_defaults方法中添加else语句?如果有,怎么样?这是检查布尔字段的好方法吗? (我知道有些数据库将它们存储为0和1,有些数据库存储为T和F)。

还有一些'rails style'解决方案吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

首先if (shipped = 0 || reached = 0)正在使用作业=而不是比较==所以发货总是零,因为发货(0)是&#34; truthy&#34;条件的后半部分被忽略了。

其次,self.shipped_at = nil || self.reached_at = nil将始终设置为nil。同样,你没有使用比较==,因为第一部分是零,所以第二部分总是被执行。

更好的解决方案可能是......

class Item < ActiveRecord::Base
  before_save :dates_defaults

  def dates_defaults
    self.shipped_at = nil unless shipped?
    self.reached_at = nil unless reached?
  end

end

如果发货和到达是布尔值,您自动发货?到达了吗?方法