gpt4 book ai didi

ruby-on-rails - Rails - 奇怪的 time_select 错误行为

转载 作者:行者123 更新时间:2023-12-05 08:50:30 24 4
gpt4 key购买 nike

我的 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。这一个总是正确的,但它节省了与 availabilitiestime 字段不同时区的时间。

如果我在 time_select 字段上添加 ignore_date: true 就可以修复它,但我想知道为什么会这样?这正常吗,我错过了什么?或者是一些非常奇怪的 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

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

<%= 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 上,您可以查看上面的链接。

最佳答案

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

heroku config:add TZ="Europe/Paris"

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

Details

编辑

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

可用性[started_at(1i)],

可用性[started_at(2i)]

可用性[started_at(3i)]

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

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

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

关于ruby-on-rails - Rails - 奇怪的 time_select 错误行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61836410/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com