Ruby on Rails 5.0 发布记
Rails 5.0 的重要变化:
Action Cable
Rails API
Active Record Attributes API
测试运行程序
rails
CLI 全面取代 RakeSprockets 3
Turbolinks 5
要求 Ruby 2.2.2+
本文只涵盖重要变化。若想了解缺陷修正和小变化,请查看更新日志,或者 GitHub 中 Rails 主仓库的提交历史。
1 升级到 Rails 5.0
如果升级现有应用,在继续之前,最好确保有足够的测试覆盖度。如果尚未升级到 Rails 4.2,应该先升级到 4.2 版,确保应用能正常运行之后,再尝试升级到 Rails 5.0。升级时的注意事项参见 Ruby on Rails 升级指南。
2 主要功能
2.1 Action Cable
Action Cable 是 Rails 4 新增的框架,其作用是把 WebSockets 无缝集成到 Rails 应用中。
有了 Action Cable,你就可以使用与 Rails 应用其他部分一样的风格和形式使用 Ruby 编写实时功能,而且兼顾性能和可伸缩性。这是一个全栈框架,既提供了客户端 JavaScript 框架,也提供了服务器端 Ruby 框架。你对使用 Active Record 或其他 ORM 编写的领域模型有完全的访问能力。
详情参见Action Cable 概览。
2.2 API 应用
Rails 现在可用于创建专门的 API 应用了。如此以来,我们便可以创建类似 Twitter 和 GitHub 那样的 API,提供给公众使用,或者只供自己使用。
Rails API 应用通过下述命令生成:
$ rails new my_api --api
上述命令主要做三件事:
配置应用,使用有限的中间件(比常规应用少)。具体而言,不含默认主要针对浏览器应用的中间件(如提供 cookie 支持的中间件)。
让
ApplicationController
继承ActionController::API
,而不继承ActionController::Base
。与中间件一样,这样做是为了去除主要针对浏览器应用的 Action Controller 模块。配置生成器,生成资源时不生成视图、辅助方法和静态资源。
生成的应用提供了基本的 API,你可以根据应用的需要配置,加入所需的功能。
2.3 Active Record Attributes API
为模型定义指定类型的属性。如果需要,会覆盖属性的当前类型。通过这一 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 的执行方式。
详情参见文档。
2.4 测试运行程序
为了增强 Rails 运行测试的能力,这一版引入了新的测试运行程序。若想使用这个测试运行程序,输入 bin/rails test
即可。
这个测试运行程序受 RSpec
、minitest-reporters
和 maxitest
等启发,包含下述主要优势:
通过测试的行号运行单个测试。
指定多个行号,运行多个测试。
改进失败消息,也便于重新运行失败的测试。
指定
-f
选项,尽早失败,一旦发现失败就停止测试,而不是等到整个测试组件运行完毕。指定
-d
选项,等到测试全部运行完毕再显示输出。指定
-b
选项,输出完整的异常回溯信息。与
Minitest
集成,允许指定-s
选项测试种子数据,指定-n
选项运行指定名称的测试,指定-v
选项输出更详细的信息,等等。以不同颜色显示测试输出。
3 Railties
变化详情参见 Changelog。
3.1 删除
删除对
debugger
的支持,换用byebug
。因为 Ruby 2.2 不支持debugger
。(提交)删除弃用的
test:all
和test:all:db
任务。(提交)删除弃用的
Rails::Rack::LogTailer
。(提交)删除弃用的
RAILS_CACHE
常量。(提交)删除弃用的
serve_static_assets
配置。(提交)删除
doc:app
、doc:rails
和doc:gudies
三个文档任务。(提交)从默认栈中删除
Rack::ContentLength
中间件。(提交)
3.2 弃用
弃用
config.static_cache_control
,换成config.public_file_server.headers
。(拉取请求)弃用
config.serve_static_files
,换成config.public_file_server.enabled
。(拉取请求)弃用
rails
命名空间下的任务,换成app
命名空间(例如,rails:update
和rails:template
任务变成了app:update
和app:template
)。(拉取请求)
3.3 重要变化
添加 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
使用局部变量。(拉取请求)禁止在生产环境自动加载类。(提交)
4 Action Pack
变化详情参见 Changelog。
4.1 删除
删除
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 中。(拉取请求)
4.2 弃用
弃用所有
*_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=
。(提交,提交)
4.3 重要变化
添加
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?
的相应选项。(拉取请求)
5 Action View
变化详情参见 Changelog。
5.1 删除
删除弃用的
AbstractController::Base::parent_prefixes
。(提交)删除
ActionView::Helpers::RecordTagHelper
,提取为record_tag_helper
gem。(拉取请求)删除
translate
辅助方法的:rescue_format
选项,因为 I18n 不再支持。(拉取请求)
5.2 重要变化
把默认的模板处理程序由
ERB
改为Raw
。(提交)为显式依赖增加通配符匹配。(拉取请求)
把
disable_with
设为submit
标签的默认行为。提交后禁用按钮能避免多次提交。(拉取请求)局部模板的名称不再必须是有效的 Ruby 标识符。(提交)
datetime_tag
辅助方法现在生成类型为datetime-local
的input
标签。(拉取请求)
6 Action Mailer
变化详情参见 Changelog。
6.1 删除
6.2 重要变化
查找模板时会考虑默认的本地化设置和 I18n 后备机制。(提交)
为生成器创建的邮件程序添加
_mailer
后缀,让命名约定与控制器和作业相同。(拉取请求)添加
assert_enqueued_emails
和assert_no_enqueued_emails
。(拉取请求)添加
config.action_mailer.deliver_later_queue_name
选项,配置邮件程序队列的名称。(拉取请求)支持片段缓存 Action Mailer 视图。新增
config.action_mailer.perform_caching
选项,设定是否缓存邮件模板。(拉取请求)
7 Active Record
变化详情参见 Changelog。
7.1 删除
不再允许使用嵌套数组作为查询值。(拉取请求)
删除弃用的
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
常量。(提交)
7.2 弃用
弃用在查询中把类作为值传递。应该传递字符串。(拉取请求)
弃用通过返回
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
参数,指定在哪里停止批量处理。(拉取请求)
7.3 重要变化
创建表时为
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
选项,使用当前时间之外的时间更新记录的时间戳。(拉取请求)
8 Active Model
变化详情参见 Changelog。
8.1 删除
删除弃用的
ActiveModel::Dirty#reset_#{attribute}
和ActiveModel::Dirty#reset_changes
。(拉取请求)删除 XML 序列化,提取到
activemodel-serializers-xml
gem 中。(拉取请求)删除
ActionController::ModelNaming
模块。(拉取请求)
8.2 弃用
弃用通过返回
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
,而且没有替代方法。(拉取请求)
8.3 重要变化
添加
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
为默认值。(拉取请求)
9 Active Job
变化详情参见 Changelog。
9.1 重要变化
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。这是更好的默认值,因为测试不会错误地依赖同步行为。(提交)
10 Active Support
变化详情参见 Changelog。
10.1 删除
删除弃用的
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 自带了。(拉取请求)
10.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)
。(拉取请求)
10.3 重要变化
为
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
支持多次实例化日志记录器,避免共享标签。(拉取请求)
11 名誉榜
得益于众多贡献者,Rails 才能变得这么稳定和强健。向他们致敬!
反馈
我们鼓励您帮助提高本指南的质量。
如果看到如何错字或错误,请反馈给我们。 您可以阅读我们的文档贡献指南。
您还可能会发现内容不完整或不是最新版本。 请添加缺失文档到 master 分支。请先确认 Edge Guides 是否已经修复。 关于用语约定,请查看Ruby on Rails 指南指导。
无论什么原因,如果你发现了问题但无法修补它,请创建 issue。
最后,欢迎到 rubyonrails-docs 邮件列表参与任何有关 Ruby on Rails 文档的讨论。