date_select保存当月可用的较高日期

时间:2013-08-22 12:13:52

标签: ruby-on-rails

我有一个简单的日期时间属性,可以在视图

上选择这样的日期
= f.date_select :period_end_at, default: { day: 31 }

默认为月份的最后一天作为示例。问题是,如果选择的月份为“6月”,则为30天,因为6月份没有“31”天,它会将对象保存为第1天而不是第30天。

如果所提供的价值高于月亮可用的价值,是否有一种简单的方法可以始终保存到月份的最高日期?

2 个答案:

答案 0 :(得分:0)

不确定是否可以缩短,但这应该有用(如果我理解你的问题):

= f.date_select :period_end_at, default: { day: Time.days_in_month(Time.now.month) }

答案 1 :(得分:0)

看看这个js snippet,它适用于我的Rails 4.2.0

<script>
$(function(){
  railsMonthDates();
  $("select[id*=_2i], select[id*=_1i]").change( railsMonthDates );
});

function railsMonthDates() {
  $("select[id*=_2i]").each(function(){
    $monthSelect = $(this);
    $daySelect = $(this).siblings("select[id*=_3i]");
    $yearSelect = $(this).siblings("select[id*=_1i]");

    var year = parseInt($yearSelect.val());
    var month = parseInt($monthSelect.val());
    var days = new Date(year, month, 0).getDate();

    var selectedDay = $daySelect.val()
    $daySelect.html('');
    for(var i=1; i<=days; i++) {
      $daySelect.append('<option value="'+i+'">'+i+'</option>');
    }
    $daySelect.val(selectedDay);
  });
}
</script>

只需将其粘贴到具有表单的部分即可。 请注意,它匹配具有id*=_1iid*=_2iid*=_3i的每个元素,因此如果您有更多f.date_select,则需要指定更好的匹配器。