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
列是time
postgres类型的。当我创建一个新记录时,它会保存started_at
值,比选定的值早一小时。在更新时它可以正常工作。
我注意到以下几点:我只能在 heroku 上复制它(在本地我不能复制它)。它仅适用于创建,并且仅在我设置之后才起作用default_timezone
,application.rb
正如您在此提交中看到的那样。
该应用程序还有另一个模型tasks
,该模型以名为started_at
和类型的列命名datetime
。这一次的作品总是正确的,但它保存在不同的时区比时间time
的领域availabilities
。
如果我添加ignore_date: true
time_select 字段,我可以修复它,但我想知道为什么会发生这种情况?这是正常的,我错过了什么吗?或者是一些非常奇怪的 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
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
记录不是这种情况,所以它可能与time
postgres 类型和active_record
时区有关。这仅发生在 heroku 上,因为您可以查看上面的链接。
发生这种情况是因为您需要考虑服务器的时区。您还需要配置 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
我有根据的猜测是他们搞乱了夏令时,从而造成了异常。
归档时间: |
|
查看次数: |
275 次 |
最近记录: |