在表单中使用date_select并希望rejecct_if日期为空

时间:2012-05-22 02:40:27

标签: ruby-on-rails nested-form-for

我有一个期间模型,包含start_date和end_date。它属于Topic模型。

在我的主题表单中,我也希望管理这段时间。所以首先我只使用两个文本字段来表示期间的两个日期。我也有一个reject_if,end_date是nil。

  accepts_nested_attributes_for :period,
    reject_if: lambda { |p| p[:end_date].blank? }

有效。几个月后,我改变了表单以使用date_select,它显示了几个用于输入日期的select语句。

当我这样做时,我发现每个选择都是这样的:

<select name="topic[period_attributes][end_date(1i)]" id="topic_period_attributes_end_date_1i">

注意1i,这意味着我的reject_if不再有效,因为任何东西都会被拒绝。我需要改为:

  accepts_nested_attributes_for :period,
    reject_if: lambda { |p| p[:'end_date(1i)']].blank? }

这样可行,但它不如以前那么好(仅检查日期的年份似乎容易出错)。

使用date_select时是否有正确的拒绝方式?

1 个答案:

答案 0 :(得分:0)

您可以添加一个类助手方法来检查:end_date属性的所有部分:

def self.date_populated?(params)
  ['1i', '2i', '3i'].select{|date_part| 
    params[:"end_date(#{date_part})"].blank?
  }.blank?
end

并检查帮助者:

reject_if: lambda { |p| !date_populated?(p) }