英文:
Configure Rails console's default date time format
问题
默认情况下,我们的Rails应用程序显示日期时间如下:
> Sun, 08 Jan 2023 16:52:46.610977000 UTC +00:00
这也在Rails控制台中显示,当检查时间对象时。
是否可以仅为Rails控制台设置不同的日期时间格式?
英文:
By default, our Rails application displays date time like this
> Sun, 08 Jan 2023 16:52:46.610977000 UTC +00:00
This is also shown in Rails console, when a time object is inspected.
Is it possible to set a different date time format, just for the Rails console alone?
答案1
得分: 2
以下是代码部分的翻译:
# File activesupport/lib/active_support/time_with_zone.rb, line 150
def inspect
"#{time.strftime('%a, %d %b %Y %H:%M:%S.%9N')} #{zone} #{formatted_offset}"
end
# config/application.rb
module YourApp
class Application < Rails::Application
console do
# this block is called only when running console
class ActiveSupport::TimeWithZone
def inspect
time.strftime('%Y-%m-%d %H:%M:%S')
end
end
end
end
end
$ bin/rails console
Loading development environment (Rails 7.0.6)
irb(main):001:0> Time.current
=> 2023-07-20 12:36:10
$ bin/rails runner 'p Time.current'
Thu, 20 Jul 2023 12:38:47.934270000 CEST +02:00
虽然 Rails 不会更改 Time#inspect
,但它会修改 Ruby 内置类 Date
和 DateTime
的 inspect
方法,以使它们更易读,参见 core_ext/date/conversions.rb
和 core_ext/date_time/conversions.rb
。如果需要,您也可以通过修补这些类来为控制台使用提供自己的 inspect
实现。
但请记住,修补类和更改现有行为始终存在破坏某些东西的风险。
英文:
That format is the output from TimeWithZone#inspect
, which is hard-coded:
# File activesupport/lib/active_support/time_with_zone.rb, line 150
def inspect
"#{time.strftime('%a, %d %b %Y %H:%M:%S.%9N')} #{zone} #{formatted_offset}"
end
Rails however provides a console
block to register code which gets only executed when running the Rails console (casually mentioned in the docs for config.console
). You could use it to provide your own inspect
method while running console, e.g.:
# config/application.rb
module YourApp
class Application < Rails::Application
console do
# this block is called only when running console
class ActiveSupport::TimeWithZone
def inspect
time.strftime('%Y-%m-%d %H:%M:%S')
end
end
end
end
end
$ bin/rails console
Loading development environment (Rails 7.0.6)
irb(main):001:0> Time.current
=> 2023-07-20 12:36:10
Other rails execution contexts are not affected:
$ bin/rails runner 'p Time.current'
Thu, 20 Jul 2023 12:38:47.934270000 CEST +02:00
Note that Time.current
is a Rails method which (usually) returns an instance of ActiveSupport::TimeWithZone
, not an instance of Ruby's built-in Time
class.
Although Rails doesn't change Time#inspect
, it alters the inspect
methods for Ruby's built-in classes Date
and DateTime
to make them more readable, see core_ext/date/conversions.rb
and core_ext/date_time/conversions.rb
. If needed, you can provide your own inspect
implementation for console use by patching those classes as well.
But keep in mind that patching classes and altering existing behavior always comes at the risk of breaking something.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论