如何在轨道上使用ruby获取正确的输入日期?

时间:2016-04-18 15:29:21

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

我的模型文件

*class User < ActiveRecord::Base

  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable,:confirmable
   validates :fullname, presence: true, length: {maximum: 40}  
   validates :phone_number, presence: true, length: {maximum: 12} validates_date :date_of_birth, :before => lambda { 18.years.ago },
                               :before_message => "must be at least 18 years old"
end*

我的Html文件

<%= f.label :date_of_birth %><br />
    <%= f.date_select :date_of_birth, order: [:day, :month, :year], :start_year=>1910 %>

在选择2月的日期时,它显示31天而不是28 ..在数据库中,它正在添加3天,好像我们选择31 st febrauary ..在数据库中它显示03年3月。 我怎样才能有效日历? 感谢您提前提出的建议

2 个答案:

答案 0 :(得分:1)

由于Rails帮助程序生成静态HTML,因此您必须使用javascript。基本上,您可以在月份对象上侦听change事件,然后使用内置的javascript Date来获取该月的天数。

我发现以下内容对我有用。但是,我没有写它,所以请自己完全测试一下(感谢https://gist.github.com/kpfefferle/1928544)。

$(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);
      });
    }

答案 1 :(得分:0)

如果您不关心旧的浏览器支持,可以使用date_field帮助程序解决此问题。它在移动设备上也会很好用。

date_field("user", "born_on", min: "2014-05-20")
# => <input id="user_born_on" name="user[born_on]" type="date" min="2014-05-20" />