我有一个简单的 datetime 属性可以在视图中选择这样的日期
= f.date_select :period_end_at, default: { day: 31 }
它默认为每月的最后一天作为示例。问题是,如果选择的月份是有 30 天的“六月”,由于六月没有“31”天,它会将对象保存为第 1 天而不是第 30 天。
如果提供的值首先适用于该月,是否有一种简单的方法可以始终保存到该月的最高日?
我有一个简单的 datetime 属性可以在视图中选择这样的日期
= f.date_select :period_end_at, default: { day: 31 }
它默认为每月的最后一天作为示例。问题是,如果选择的月份是有 30 天的“六月”,由于六月没有“31”天,它会将对象保存为第 1 天而不是第 30 天。
如果提供的值首先适用于该月,是否有一种简单的方法可以始终保存到该月的最高日?
不确定它是否可以缩短,但这应该有效(如果我正确理解了您的问题):
= f.date_select :period_end_at, default: { day: Time.days_in_month(Time.now.month) }
看看这个js 片段,它适用于 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*=_1i
,id*=_2i
或的元素id*=_3i
,所以如果你有更多f.date_select
,你需要指定一个更好的匹配器。