Rails 5.0 的重要变化:
-
Action Cable
-
Rails API
-
Active Record Attributes API
-
测试运行程序
-
rails
CLI 全面取代 Rake -
Sprockets 3
-
Turbolinks 5
-
要求 Ruby 2.2.2+
本文只涵盖重要变化。若想了解缺陷修正和小变化,请查看更新日志或 GitHub 中 Rails 主仓库的提交历史。
如果升级现有应用,在继续之前,最好确保有足够的测试覆盖度。如果尚未升级到 Rails 4.2,应该先升级到 4.2 版,确保应用能正常运行之后,再尝试升级到 Rails 5.0。升级时的注意事项参见 upgrading_ruby_on_rails.adoc。
Action Cable 是 Rails 5 新增的框架,其作用是把 WebSockets 无缝集成到 Rails 应用中。
有了 Action Cable,你就可以使用与 Rails 应用其他部分一样的风格和形式使用 Ruby 编写实时功能,而且兼顾性能和可伸缩性。这是一个全栈框架,既提供了客户端 JavaScript 框架,也提供了服务器端 Ruby 框架。你对使用 Active Record 或其他 ORM 编写的领域模型有完全的访问能力。
Rails API 应用通过下述命令生成:
$ rails new my_api --api
上述命令主要做三件事:
-
配置应用,使用有限的中间件(比常规应用少)。具体而言,不含默认主要针对浏览器应用的中间件(如提供 cookie 支持的中间件)。
-
让
ApplicationController
继承ActionController::API
,而不继承ActionController::Base
。与中间件一样,这样做是为了去除主要针对浏览器应用的 Action Controller 模块。 -
配置生成器,生成资源时不生成视图、辅助方法和静态资源。
生成的应用提供了基本的 API,你可以根据应用的需要配置,加入所需的功能。
详情参见api_app.adoc。
为模型定义指定类型的属性。如果需要,会覆盖属性的当前类型。通过这一 API 可以控制属性的类型在模型和 SQL 之间的转换。此外,还可以改变传给 ActiveRecord::Base.where
的值的行为,以便让领域对象可以在 Active Record 的大多数地方使用,而不用依赖实现细节或使用猴子补丁。
通过这一 API 可以实现:
-
覆盖 Active Record 检测到的类型。
-
提供默认类型。
-
属性不一定对应于数据库列。
# db/schema.rb
create_table :store_listings, force: true do |t|
t.decimal :price_in_cents
t.string :my_string, default: "original default"
end
# app/models/store_listing.rb
class StoreListing < ActiveRecord::Base
end
store_listing = StoreListing.new(price_in_cents: '10.1')
# 以前
store_listing.price_in_cents # => BigDecimal.new(10.1)
StoreListing.new.my_string # => "original default"
class StoreListing < ActiveRecord::Base
attribute :price_in_cents, :integer # custom type
attribute :my_string, :string, default: "new default" # default value
attribute :my_default_proc, :datetime, default: -> { Time.now } # default value
attribute :field_without_db_column, :integer, array: true
end
# 现在
store_listing.price_in_cents # => 10
StoreListing.new.my_string # => "new default"
StoreListing.new.my_default_proc # => 2015-05-30 11:04:48 -0600
model = StoreListing.new(field_without_db_column: ["1", "2", "3"])
model.attributes # => {field_without_db_column: [1, 2, 3]}
- 创建自定义类型
-
你可以自定义类型,只要它们能响应值类型定义的方法。
deserialize
或cast
会在自定义类型的对象上调用,传入从数据库或控制器获取的原始值。通过这一特性可以自定义转换方式,例如处理货币数据。 - 查询
-
ActiveRecord::Base.where
会使用模型类定义的类型把值转换成 SQL,方法是在自定义类型对象上调用serialize
。这样,做 SQL 查询时可以指定如何转换值。
- Dirty Tracking
-
通过属性的类型可以改变 Dirty Tracking 的执行方式。
详情参见文档。
为了增强 Rails 运行测试的能力,这一版引入了新的测试运行程序。若想使用这个测试运行程序,输入 bin/rails test
即可。
这个测试运行程序受 RSpec
、minitest-reporters
和 maxitest
等启发,包含下述主要优势:
-
通过测试的行号运行单个测试。
-
指定多个行号,运行多个测试。
-
改进失败消息,也便于重新运行失败的测试。
-
指定
-f
选项,尽早失败,一旦发现失败就停止测试,而不是等到整个测试组件运行完毕。 -
指定
-d
选项,等到测试全部运行完毕再显示输出。 -
指定
-b
选项,输出完整的异常回溯信息。 -
与
Minitest
集成,允许指定-s
选项测试种子数据,指定-n
选项运行指定名称的测试,指定-v
选项输出更详细的信息,等等。 -
以不同颜色显示测试输出。
变化详情参见 Changelog。
-
添加 Rails 测试运行程序
bin/rails test
。(拉取请求) -
添加
bin/rails restart
任务,通过 touchtmp/restart.txt
文件重启 Rails 应用。(拉取请求) -
添加
bin/rails initializers
任务,按照 Rails 调用的顺序输出所有初始化脚本。(拉取请求) -
添加
bin/rails dev:cache
任务,在开发环境启用或禁用缓存。(拉取请求) -
添加
bin/update
脚本,自动更新开发环境。(拉取请求) -
新生成的应用在 Linux 和 macOS 中启用文件系统事件监控。把
--skip-listen
传给生成器可以禁用这一功能。(提交,提交) -
使用环境变量
RAILS_LOG_TO_STDOUT
把生产环境的日志输出到 STDOUT。(拉取请求) -
新应用通过 IncludeSudomains 首部启用 HSTS。(拉取请求)
-
应用生成器创建一个名为
config/spring.rb
的新文件,告诉 Spring 监视其他常见的文件。(提交) -
添加
--skip-action-mailer
,生成新应用时不生成 Action Mailer。(拉取请求) -
删除
tmp/sessions
目录,以及与之对应的 Rake 清理任务。(拉取请求) -
让脚手架生成的
_form.html.erb
使用局部变量。(拉取请求) -
禁止在生产环境自动加载类。(提交)
变化详情参见 Changelog。
-
删除
ActionDispatch::Request::Utils.deep_munge
。(提交) -
删除
ActionController::HideActions
。(拉取请求) -
删除占位方法
respond_to
和respond_with
,提取为responders
gem。(提交) -
删除弃用的断言文件。(提交)
-
不再允许在 URL 辅助方法中使用字符串键。(提交)
-
删除弃用的
*_path
辅助方法的only_path
选项。(提交) -
删除弃用的
NamedRouteCollection#helpers
。(提交) -
不再允许使用不带
#
的:to
选项定义路由。(提交) -
删除弃用的
ActionDispatch::Response#to_ary
。(提交) -
删除弃用的
ActionDispatch::Request#deep_munge
。(提交) -
删除弃用的
ActionDispatch::Http::Parameters#symbolized_path_parameters
。(提交) -
不再允许在控制器测试中使用
use_route
选项。(提交) -
删除
assigns
和assert_template
,提取为rails-controller-testing
gem 中。(拉取请求)
-
弃用所有
*_filter
回调,换成*_action
。(拉取请求) -
弃用
*_via_redirect
集成测试方法。请在请求后手动调用follow_redirect!
,效果一样。(拉取请求) -
弃用
AbstractController#skip_action_callback
,换成单独的skip_callback
方法。(拉取请求) -
弃用
render
方法的:nothing
选项。(拉取请求) -
以前,
head
方法的第一个参数是一个 散列,而且可以设定默认的状态码;现在弃用了。(拉取请求) -
弃用通过字符串或符号指定中间件类名。直接使用类名。(提交)
-
弃用通过常量访问 MIME 类型(如
Mime::HTML
)。换成通过下标和符号访问(如Mime[:html]
)。(拉取请求) -
弃用
redirect_to :back
,换成redirect_back
。后者必须指定fallback_location
参数,从而避免出现RedirectBackError
异常。(拉取请求) -
ActionDispatch::IntegrationTest
和ActionController::TestCase
弃用位置参数,换成关键字参数。(拉取请求) -
弃用
:controller
和:action
路径参数。(拉取请求) -
弃用控制器实例的
env
方法。(提交) -
启用了
ActionDispatch::ParamsParser
,而且从中间件栈中删除了。若想配置参数解析程序,使用ActionDispatch::Request.parameter_parsers=
。(提交,提交)
-
添加
ActionController::Renderer
,在控制器动作之外渲染任意模板。(拉取请求) -
把
ActionController::TestCase
和ActionDispatch::Integration
的 HTTP 请求方法的参数换成关键字参数。(拉取请求) -
为 Action Controller 添加
http_cache_forever
,缓存响应,永不过期。(拉取请求) -
为获取请求设备提供更友好的方式。(拉取请求)
-
对没有模板的动作来说,渲染
head :no_content
,而不是抛出异常。(拉取请求) -
支持覆盖控制器默认的表单构建程序。(拉取请求)
-
添加对只提供 API 的应用的支持。添加
ActionController::API
,在这类应用中取代ActionController::Base
。(拉取请求) -
ActionController::Parameters
不再继承自HashWithIndifferentAccess
。(拉取请求) -
减少
config.force_ssl
和config.ssl_options
的危险性,更便于禁用。(拉取请求) -
允许
ActionDispatch::Static
返回任意首部。(拉取请求) -
把
protect_from_forgery
提供的保护措施默认设为false
。(提交) -
ActionController::TestCase
将在 Rails 5.1 中移除,制成单独的 gem。换用ActionDispatch::IntegrationTest
。(提交) -
Rails 默认生成弱 ETag。(拉取请求)
-
如果控制器动作没有显式调用
render
,而且没有对应的模板,隐式渲染head :no_content
,不再抛出异常。(拉取请求,拉取请求) -
添加一个选项,为每个表单指定单独的 CSRF 令牌。(拉取请求)
-
为集成测试添加请求编码和响应解析功能。(拉取请求)
-
添加
ActionController#helpers
,在控制器层访问视图上下文。(拉取请求) -
不用的闪现消息在存入会话之前删除。(拉取请求)
-
让
fresh_when
和stale?
支持解析记录集合。(拉取请求) -
ActionController::Live
变成一个ActiveSupport::Concern
。这意味着,不能直接将其引入其他模块,而不使用ActiveSupport::Concern
扩展,否则,ActionController::Live
在生产环境无效。有些人还可能会使用其他模块引入处理Warden
/Devise
身份验证失败的特殊代码,因为中间件无法捕获派生的线程抛出的:warden
异常——使用ActionController::Live
时就是如此。(详情) -
引入
Response#strong_etag=
和#weak_etag=
,以及fresh_when
和stale?
的相应选项。(拉取请求)
变化详情参见 Changelog。
-
删除弃用的
AbstractController::Base::parent_prefixes
。(提交) -
删除
ActionView::Helpers::RecordTagHelper
,提取为record_tag_helper
gem。(拉取请求) -
删除
translate
辅助方法的:rescue_format
选项,因为 I18n 不再支持。(拉取请求)
变化详情参见 Changelog。
变化详情参见 Changelog。
-
不再允许使用嵌套数组作为查询值。(拉取请求)
-
删除弃用的
ActiveRecord::Tasks::DatabaseTasks#load_schema
,替换为ActiveRecord::Tasks::DatabaseTasks#load_schema_for
。(提交) -
删除弃用的
serialized_attributes
。(提交) -
删除
has_many :through
弃用的自动计数器缓存。(提交) -
删除弃用的
sanitize_sql_hash_for_conditions
。(提交) -
删除弃用的
Reflection#source_macro
。(提交) -
删除弃用的
symbolized_base_class
和symbolized_sti_name
。(提交) -
删除弃用的
ActiveRecord::Base.disable_implicit_join_references=
。(提交) -
不再允许使用字符串存取方法访问连接规范。(提交)
-
不再预加载依赖实例的关联。(提交)
-
PostgreSQL 值域不再排除下限。(提交)
-
删除通过缓存的 Arel 修改关系时的弃用消息。现在抛出
ImmutableRelation
异常。(提交) -
从核心中删除
ActiveRecord::Serialization::XmlSerializer
,提取到activemodel-serializers-xml
gem 中。(拉取请求) -
核心不再支持旧的
mysql
数据库适配器。多数用户应该使用mysql2
。找到维护人员后,会把对mysql
的支持制成单独的 gem。(拉取请求,拉取请求) -
不再支持
protected_attributes
gem。(提交) -
不再支持低于 9.1 版的 PostgreSQL。(拉取请求)
-
不再支持
activerecord-deprecated_finders
gem。(提交) -
删除
ActiveRecord::ConnectionAdapters::Column::TRUE_VALUES
常量。(提交)
-
弃用在查询中把类作为值传递。应该传递字符串。(拉取请求)
-
弃用通过返回
false
停止 Active Record 回调链。建议的方式是throw(:abort)
。(拉取请求) -
弃用
ActiveRecord::Base.errors_in_transactional_callbacks=
。(提交) -
弃用
Relation#uniq
,换用Relation#distinct
。(提交) -
弃用 PostgreSQL 的
:point
类型,换成返回Point
对象,而不是数组。(拉取请求) -
弃用通过为关联方法传入一个真值参数强制重新加载关联。(拉取请求)
-
弃用关联的错误键
restrict_dependent_destroy
,换成更好的键名。(拉取请求) -
#tables
的同步行为。(拉取请求) -
弃用
SchemaCache#tables
、SchemaCache#table_exists?
和SchemaCache#clear_table_cache!
,换成相应的数据源方法。(拉取请求) -
弃用 SQLite3 和 MySQL 适配器的
connection.tables
。(拉取请求) -
弃用把参数传给
#tables
:在某些适配器中(mysql2、sqlite3),它返回表和视图,而其他适配器(postgresql)只返回表。为了保持行为一致,未来#tables
只返回表。(拉取请求) -
弃用
table_exists?
方法:它既检查表,也检查视图。为了与#tables
的行为一致,未来#table_exists?
只检查表。(拉取请求) -
弃用
find_nth
方法的offset
参数。请在关系上使用offset
方法。(拉取请求) -
弃用
DatabaseStatements
中的{insert|update|delete}_sql
。换用公开方法{insert|update|delete}
。(拉取请求) -
弃用
use_transactional_fixtures
,换成更明确的use_transactional_tests
。(拉取请求) -
弃用把一列传给
ActiveRecord::Connection#quote
。(提交) -
为
find_in_batches
方法添加与start
参数对应的end
参数,指定在哪里停止批量处理。(拉取请求)
-
创建表时为
references
添加foreign_key
选项。(提交) -
新的 Attributes API。(提交)
-
为
ActiveRecord::Relation
添加#cache_key
方法。(拉取请求) -
把
timestamps
默认的null
值改为false
。(提交) -
添加
ActiveRecord::SecureToken
,在模型中使用SecureRandom
为属性生成唯一令牌。(拉取请求) -
为
drop_table
添加:if_exists
选项。(拉取请求) -
添加
ActiveRecord::Base#accessed_fields
,在模型中只从数据库中选择数据时快速查看读取哪些字段。(提交) -
为
ActiveRecord::Relation
添加#or
方法,允许在WHERE
或HAVING
子句中使用OR
运算符。(提交) -
添加
ActiveRecord::Base.suppress
,禁止在指定的块执行时保存接收者。(拉取请求) -
如果关联的对象不存在,
belongs_to
现在默认触发验证错误。在具体的关联中可以通过optional: true
选项禁止这一行为。因为添加了optional
选项,所以弃用了required
选项。(拉取请求) -
添加
config.active_record.dump_schemas
选项,用于配置db:structure:dump
的行为。(拉取请求) -
添加
config.active_record.warn_on_records_fetched_greater_than
选项。(拉取请求) -
为 MySQL 添加原生支持的 JSON 数据类型。(拉取请求)
-
支持在 PostgreSQL 中并发删除索引。(拉取请求)
-
为连接适配器添加
#views
和#view_exists?
方法。(拉取请求) -
添加
ActiveRecord::Base.ignored_columns
,让一些列对 Active Record 不可见。(拉取请求) -
添加
connection.data_sources
和connection.data_source_exists?
。这两个方法判断什么关系可以用于支持 Active Record 模型(通常是表和视图)。(拉取请求) -
允许在 YAML 固件文件中设定模型类。(拉取请求)
-
生成数据库迁移时允许把
uuid
用作主键。(拉取请求) -
添加
ActiveRecord::Relation#left_joins
和ActiveRecord::Relation#left_outer_joins
。(拉取请求) -
添加
after_{create,update,delete}_commit
回调。(拉取请求) -
为迁移类添加版本,这样便可以修改参数的默认值,而不破坏现有的迁移,或者通过弃用循环强制重写。(拉取请求)
-
现在,
ApplicationRecord
是应用中所有模型的超类,这与控制器一样,控制器是ApplicationController
的子类,而不是ActionController::Base
。因此,应用可以在一处全局配置模型的行为。(拉取请求) -
添加
#second_to_last
和#third_to_last
方法。(拉取请求) -
允许通过存储在 PostgreSQL 和 MySQL 数据库元数据中的注释注解数据库对象。(拉取请求)
-
为
mysql2
适配器(0.4.4+)添加预处理语句支持。以前只支持弃用的mysql
适配器。若想启用,在config/database.yml
中设定prepared_statements: true
。(拉取请求) -
允许在关系对象上调用
ActionRecord::Relation#update
,在关系涉及的所有对象上运行回调。(拉取请求) -
为
save
方法添加:touch
选项,允许保存记录时不更新时间戳。(拉取请求) -
为 PostgreSQL 添加表达式索引和运算符类支持。(提交)
-
添加
:index_errors
选项,为嵌套属性的错误添加索引。(拉取请求) -
添加对双向销毁依赖的支持。(拉取请求)
-
支持在事务型测试中使用
after_commit
回调。(拉取请求) -
添加
foreign_key_exists?
方法,检查表中是否有外键。(拉取请求) -
为
touch
方法添加:time
选项,使用当前时间之外的时间更新记录的时间戳。(拉取请求) -
修改事务回调,不再抑制错误。在此之前,事务回调抛出的错误会做特殊处理,输出到日志中,除非设定了
raise_in_transactional_callbacks = true
选项(最近弃用了)。现在,这些错误不再做特殊处理,而是直接冒泡,与其他回调的行为保持一致。(提交)
变化详情参见 Changelog。
-
删除弃用的
ActiveModel::Dirty#reset_#{attribute}
和ActiveModel::Dirty#reset_changes
。(拉取请求) -
删除 XML 序列化,提取到
activemodel-serializers-xml
gem 中。(拉取请求) -
删除
ActionController::ModelNaming
模块。(拉取请求)
-
弃用通过返回
false
停止 Active Model 和ActiveModel::Validations
回调链的方式。推荐的方式是throw(:abort)
。(拉取请求) -
弃用行为不一致的
ActiveModel::Errors#get
、ActiveModel::Errors#set
和ActiveModel::Errors#[]=
方法。(拉取请求) -
弃用
validates_length_of
的:tokenizer
选项,换成普通的 Ruby。(拉取请求) -
弃用
ActiveModel::Errors#add_on_empty
和ActiveModel::Errors#add_on_blank
,而且没有替代方法。(拉取请求)
-
添加
ActiveModel::Errors#details
,判断哪个验证失败。(拉取请求) -
把
ActiveRecord::AttributeAssignment
提取为ActiveModel::AttributeAssignment
,以便把任意对象作为引入的模块使用。(拉取请求) -
添加
ActiveModel::Dirty#[attr_name]_previously_changed?
和ActiveModel::Dirty#[attr_name]_previous_change
,更好地访问保存模型后有变的记录。(拉取请求) -
让
valid?
和invalid?
一次验证多个上下文。(拉取请求) -
让
validates_acceptance_of
除了1
之外接受true
为默认值。(拉取请求)
变化详情参见 Changelog。
-
ActiveJob::Base.deserialize
委托给作业类,以便序列化作业时依附任意元数据,并在执行时读取。(拉取请求) -
允许在单个作业中配置队列适配器,防止相互影响。(拉取请求)
-
生成的作业现在默认继承自
app/jobs/application_job.rb
。(拉取请求) -
允许
DelayedJob
、Sidekiq
、qu
、que
和queue_classic
把作业 ID 报给ActiveJob::Base
,通过provider_job_id
获取。(拉取请求,拉取请求,提交) -
实现一个简单的
AsyncJob
处理程序和相关的AsyncAdapter
,把作业队列放入一个concurrent-ruby
线程池。(拉取请求) -
把默认的适配器由 inline 改为 async。这是更好的默认值,因为测试不会错误地依赖同步行为。(提交)
变化详情参见 Changelog。
-
删除弃用的
ActiveSupport::JSON::Encoding::CircularReferenceError
。(提交) -
删除弃用的
ActiveSupport::JSON::Encoding.encode_big_decimal_as_string=
和ActiveSupport::JSON::Encoding.encode_big_decimal_as_string
方法。(提交) -
删除弃用的
ActiveSupport::SafeBuffer#prepend
。(提交) -
删除
Kernel
中弃用的方法:silence_stderr
、silence_stream
、capture
和quietly
。(提交) -
删除弃用的
active_support/core_ext/big_decimal/yaml_conversions
文件。(提交) -
删除弃用的
ActiveSupport::Cache::Store.instrument
和ActiveSupport::Cache::Store.instrument=
方法。(提交) -
删除弃用的
Class#superclass_delegating_accessor
,换用Class#class_attribute
。(拉取请求) -
删除弃用的
ThreadSafe::Cache
,换用Concurrent::Map
。(拉取请求) -
删除
Object#itself
,因为 Ruby 2.2 自带了。(拉取请求)
-
弃用
MissingSourceFile
,换用LoadError
。(提交) -
弃用
alias_method_chain
,换用 Ruby 2.0 引入的Module#prepend
。(拉取请求) -
弃用
ActiveSupport::Concurrency::Latch
,换用 concurrent-ruby 中的Concurrent::CountDownLatch
。(拉取请求) -
弃用
number_to_human_size
的:prefix
选项,而且没有替代选项。(拉取请求) -
弃用
Module#qualified_const_
,换用内置的Module#const_
方法。(拉取请求) -
弃用通过字符串定义回调。(拉取请求)
-
弃用
ActiveSupport::Cache::Store#namespaced_key
、ActiveSupport::Cache::MemCachedStore#escape_key
和ActiveSupport::Cache::FileStore#key_file_path
,换用normalize_key
。(拉取请求,提交) -
弃用
ActiveSupport::Cache::LocaleCache#set_cache_value
,换用write_cache_value
。(拉取请求) -
弃用
assert_nothing_raised
的参数。(拉取请求) -
弃用
Module.local_constants
,换用Module.constants(false)
。(拉取请求)
-
为
ActiveSupport::MessageVerifier
添加#verified
和#valid_message?
方法。(拉取请求) -
改变回调链停止的方式。现在停止回调链的推荐方式是明确使用
throw(:abort)
。(拉取请求) -
新增配置选项
config.active_support.halt_callback_chains_on_return_false
,指定是否允许在前置回调中停止 ActiveRecord、ActiveModel 和 ActiveModel::Validations 回调链。(拉取请求) -
把默认的测试顺序由
:sorted
改为:random
。(提交) -
为
Date
、Time
和DateTime
添加#on_weekend?
、#on_weekday?
、#next_weekday
及#prev_weekday
方法。(拉取请求,拉取请求) -
为
Date
、Time
和DateTime
的#next_week
和#prev_week
方法添加same_time
选项。(拉取请求) -
为
Date
、Time
和DateTime
添加#yesterday
和#tomorrow
对应的#prev_day
和#next_day
方法。 -
添加
SecureRandom.base58
,生成 base58 字符串。(提交) -
为
ActiveSupport::TestCase
添加file_fixture
。这样更便于在测试用例中访问示例文件。(拉取请求) -
为
Enumerable
和Array
添加#without
,返回一个可枚举对象副本,但是不含指定的元素。(拉取请求) -
添加
ActiveSupport::ArrayInquirer
和Array#inquiry
。(拉取请求) -
添加
ActiveSupport::TimeZone#strptime
,使用指定的时区解析时间。(提交) -
受
Integer#zero?
启发,添加Integer#positive?
和Integer#negative?
。(提交) -
为
ActiveSupport::OrderedOptions
中的读值方法添加炸弹版本,如果没有值,抛出KeyError
。(拉取请求) -
添加
Time.days_in_year
,返回指定年份中的日数,如果没有参数,返回当前年份。(提交) -
添加一个文件事件监视程序,异步监测应用源码、路由、本地化文件等的变化。(拉取请求)
-
添加
thread_m
/cattr_accessor
/reader
/writer
方法,声明存活在各个线程中的类和模块变量。(拉取请求) -
添加
Array#second_to_last
和Array#third_to_last
方法。(拉取请求) -
发布
ActiveSupport::Executor
和ActiveSupport::Reloader
API,允许组件和库管理并参与应用代码的执行以及应用重新加载过程。(拉取请求) -
ActiveSupport::Duration
现在支持使用和解析 ISO8601 格式。(拉取请求) -
启用
parse_json_times
后,ActiveSupport::JSON.decode
支持解析 ISO8601 本地时间。(拉取请求) -
ActiveSupport::JSON.decode
现在解析日期字符串后返回Date
对象。(拉取请求) -
让
TaggedLogging
支持多次实例化日志记录器,避免共享标签。(拉取请求)