Rails - 奇怪的 time_select 错误行为

Joh*_*Del 2 ruby postgresql activerecord ruby-on-rails heroku

我的 rails repo 示例在这里:https : //github.com/johndel/strange_timeselect

奇怪行为的复制可以在这里显示:https : //captain24.herokuapp.com/availabilities/new

我有以下问题time_select:在一个带有 postgresql 的新 rails 应用程序中,我有一个模型 ( availabilities),其中的started_at列是timepostgres类型的。当我创建一个新记录时,它会保存started_at值,比选定的值早一小时。在更新时它可以正常工作。

我注意到以下几点:我只能在 heroku 上复制它(在本地我不能复制它)。它仅适用于创建,并且仅在我设置之后才起作用default_timezoneapplication.rb正如您在此提交中看到的那样。

该应用程序还有另一个模型tasks,该模型以名为started_at和类型的列命名datetime。这一次的作品总是正确的,但它保存在不同的时区比时间time的领域availabilities

如果我添加ignore_date: truetime_select 字段,我可以修复它,但我想知道为什么会发生这种情况?这是正常的,我错过了什么吗?或者是一些非常奇怪的 ruby​​ 或 rails 错误?或者它是heroku上postgresql的问题/错误配置?

更新: 因为@max让我进一步解释代码,这里是:

关于代码,现在只有两个带有命令rails g scaffold tasks started_at:datetimerails g scaffold availabilities started_at:time. 所以一个是tasks,另一个是availabilities每个模型只有一列。我还在config/application.rb这些代码行中添加了:

config.time_zone = 'Athens'
config.active_record.default_timezone = :local
Run Code Online (Sandbox Code Playgroud)

可用性形式的代码是这样的(普通脚手架):

<%= form_with(model: task, local: true) do |form| %>
  <% if task.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(task.errors.count, "error") %> prohibited this task from being saved:</h2>

      <ul>
        <% task.errors.full_messages.each do |message| %>
          <li><%= message %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= form.label :started_at %>
    <%= form.time_select :started_at %>
  </div>

  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>
Run Code Online (Sandbox Code Playgroud)

可用性迁移代码是这样的:

class CreateAvailabilities < ActiveRecord::Migration[6.0]
  def change
    create_table :availabilities do |t|
      t.time :started_at

      t.timestamps
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

如果添加上述代码并部署在heroku上,您将能够重现该问题。

所以关于上面代码的问题是,当我创建一个availability记录时,它比它选择的少一个小时。这仅在创建时发生。task记录不是这种情况,所以它可能与timepostgres 类型和active_record时区有关。这仅发生在 heroku 上,因为您可以查看上面的链接。

MD *_*han 5

发生这种情况是因为您需要考虑服务器的时区。您还需要配置 Heroku。更改 Heroku 时间设置的命令如下所示

heroku config:add TZ="Europe/Paris"

以 UTC 以外的任何其他格式保存日期都不是一个好主意

细节

编辑

要回答为什么更新方法的工作方式不同的问题,您必须检查由 rails.Rails 呈现的表单创建额外的三个隐藏字段

availability[started_at(1i)],

availability[started_at(2i)]

availability[started_at(3i)]

在创建表单上,这些字段的默认值为 2020,5,19

但是在编辑表单上,它们的值为 2000,1,1

我有根据的猜测是他们搞乱了夏令时,从而造成了异常。