【发布时间】:2020-09-02 07:01:39
【问题描述】:
我的 rails repo 示例在这里: https://github.com/johndel/strange_timeselect
奇怪行为的复制可以在这里显示: https://captain24.herokuapp.com/availabilities/new
time_select 有以下问题:
在一个带有 postgresql 的新 Rails 应用程序中,我有一个模型 (availabilities),它的 started_at 列在 postgres 中的类型为 time。当我创建新记录时,它会保存started_at 值,比所选值早一小时。在更新时它可以正常工作。
我注意到以下内容:
我只能在heroku上复制它(在本地我无法复制它)。它仅在创建时有效,并且仅在我在 application.rb 上设置 default_timezone 后才有效,正如您在 commit 上看到的那样。
该应用程序还有另一个名为 tasks 的模型,其列名为 started_at 并键入 datetime。这个工作总是正确的,但它节省了与availabilities 的time 字段不同的时区的时间。
如果我在 time_select 字段上添加ignore_date: true 可以修复它,但我想知道为什么会发生这种情况?这是正常的,我错过了什么吗?或者是一些非常奇怪的 ruby 或 rails 错误?还是 Heroku 上的 postgresql 存在问题/配置错误?
更新: 因为 @max 要求我进一步解释代码,所以这里是:
关于代码,现在它只是两个脚手架资源,命令为rails g scaffold tasks started_at:datetime 和rails g scaffold availabilities started_at:time。所以一个是tasks,另一个是availabilities,每个模型只有一列。我还在config/application.rb 中添加了这几行代码:
config.time_zone = 'Athens'
config.active_record.default_timezone = :local
可用性表单的代码是这样的(简单的脚手架):
<%= 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 %>
可用性迁移代码如下:
class CreateAvailabilities < ActiveRecord::Migration[6.0]
def change
create_table :availabilities do |t|
t.time :started_at
t.timestamps
end
end
end
如果你添加上面的代码并部署在heroku上,你将能够重现问题。
所以关于上面代码的问题是,当我创建一个availability 记录时,它比选择的记录少一小时。这仅在创建时发生。 task 记录不是这种情况,因此它可能与 time postgres 类型和 active_record 时区有关。这仅在 heroku 上发生,您可以查看上面的链接。
【问题讨论】:
-
很难从描述代码功能的文本中做出任何有意义的事情。它真的只会产生更多的问题。而是尝试创建一个最小的可验证示例来重现您正在谈论的行为。不 - 添加到您的 github 存储库的链接不是一回事。
-
我认为我的要求很简单。我拥有无需任何努力即可重现错误的实时代码以及存储库上的代码(它只有 3 次提交,因此很容易理解发生了什么变化)。所以我在问,上述行为是否正确且符合预期,我做错了什么(以及那是什么)还是我们应该在 Rails 存储库上放一张票,因为它是一个错误?
-
您可能会这么认为,但您并没有真正帮助我们排除任何问题,而是要求读者深入研究您的代码以找出问题所在。
-
好的,我会添加更多解释。
-
为什么不使用 UTC?您想通过非标准服务器时间来解决什么问题?
标签: ruby-on-rails ruby postgresql heroku activerecord