【问题标题】:rails: set datetime column using value in a text_fieldrails:使用 text_field 中的值设置日期时间列
【发布时间】:2014-02-20 15:51:05
【问题描述】:

我的问题类似于another one,关于将文本字段中的数据放入日期时间列。看来我需要以特定顺序将数据放入 text_field 或 rails 不会接受它。问题是,我不能总是控制用户输入数据的方式。事实上,由于我刚刚添加了一个 JQuery 日期选择器,因此用户输入的值几乎总是错误的。

我认为我可以将 Date.parse 或 Time.parse 或 DateTime.parse 与 setter 方法一起使用(在 railscast 32 中提到,但这似乎对我也不起作用。我一直在争论范围错误,这似乎也是由于输入格式错误。

还有其他人使用 JQuery 日期选择器来填写日期的文本字段吗?您必须向模型或控制器添加什么魔法才能使其正常工作?为什么这么难?

【问题讨论】:

    标签: ruby-on-rails datetime


    【解决方案1】:

    我使用timeliness gem 来解决这个问题,并以我想要的格式提交日期。除了及时性,我还使用validates_timeliness 来验证日期和时间,即它不是未来或任何东西。

    要使用及时性 gem 解析字符串 'MM/DD/YYYY',您可以这样做:

    Timeliness.parse(params[:my_date], :format => 'mm/dd/yyyy')
    

    【讨论】:

      【解决方案2】:

      时间和日期解析器虽然接受多种格式,但无论如何都无法计算出您经过的任何时间段。如果出现超出范围错误,则表示您使用的格式无效。

      您可以控制jQuery Datepicker 使用的格式并选择时间解析器不会出错的格式。默认的 MM/DD/YYYY 应该可以正常工作,你传递的是什么格式?

      【讨论】:

      • 我正在尝试通过 MM/DD/YYYY 但 Rails 只接受 DD/MM/YYYY
      • 例如,如果我进入 rails 控制台并输入 Date.parse("25/07/2011") 我会得到一个有效的响应。但是如果我输入 Date.parse("7/25/2011") 我得到一个参数超出范围错误。
      • 什么版本的 Rails?我刚刚在 3.0.7 上尝试过,Date.parse("7/25/2011") 为我返回了一个有效日期。您始终可以通过 dateFormat: "DD/MM/YYYY" 修改日期选择器格式(请参阅我在原始答案中的链接),这将确保它始终创建对您在 Rails 中有效的日期格式。
      • 使用 rails 3.0.9。为了确保我的应用程序没有问题,我从头开始创建了一个新应用程序,运行 bundle,然后运行 ​​rails 控制台。我仍然无法 Date.parse("7/25/2011")
      • 我刚刚回滚到 rails 3.0.7,但仍然无法 Date.parse("7/25/2011")。我可以听取您的建议并更改日期选择器的日期格式,但如果有人只是在文本框中输入日期怎么办?它确实应该能够处理这种日期格式。
      【解决方案3】:

      如果在保存对象之前切换月份和日期字段会怎样?您可以使用 jquery / javascript 执行 onsubmit 操作,或者仅使用 date_select_tag 并在保存对象之前在控制器中移动您认为合适的参数。

      除此之外,日期格式可能有 rails 默认设置。不过,不确定您是否要更改整个应用程序的日期格式。

      【讨论】:

        【解决方案4】:

        问题是 rails/activerecord 期望日期为 ISO 格式“yyyy-mm-dd”。但这不是一种用户友好的格式

        我认为最简单的解决方案是在 datepicker 上使用 alt 属性 - 基本上,显示日期格式但提交另一种日期格式:

          = f.text_field :your_date, id: "your_date", class: "hidden" // This is hidden
          // This will show up
          = text_field_tag "date[something_we_will_not_use]", f.object.your_date.strftime("%m/%d/%Y"),
            class: "datepicker", 'data-alt-field' => '#your_date'
        

        日期选择器初始化

        $('.datepicker').each(function() {
        
              var alt_field = $(this).attr('data-alt-field');
        
              $this.datepicker({
                dateFormat: "mm/dd/yy",
                prevText: '<i class="fa fa-chevron-left"></i>',
                nextText: '<i class="fa fa-chevron-right"></i>',
                altField: alt_field, // This is the tag where the date will be filled
                altFormat: "yy/mm/dd" // This is how the date will be posted to your controller
              });
            })
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-09-27
          • 1970-01-01
          • 1970-01-01
          • 2023-03-24
          • 1970-01-01
          • 2022-01-09
          • 1970-01-01
          相关资源
          最近更新 更多