更多内容 rubyonrails.org: 更多内容

Ruby on Rails 5.0 发布记

Rails 5.0 的重要变化:

本文只涵盖重要变化。若想了解缺陷修正和小变化,请查看更新日志或 GitHub 中 Rails 主仓库的提交历史

1 升级到 Rails 5.0

如果升级现有应用,在继续之前,最好确保有足够的测试覆盖度。如果尚未升级到 Rails 4.2,应该先升级到 4.2 版,确保应用能正常运行之后,再尝试升级到 Rails 5.0。升级时的注意事项参见 从 Rails 4.2 升级到 5.0

2 主要功能

2.1 Action Cable

Action Cable 是 Rails 5 新增的框架,其作用是把 WebSockets 无缝集成到 Rails 应用中。

有了 Action Cable,你就可以使用与 Rails 应用其他部分一样的风格和形式使用 Ruby 编写实时功能,而且兼顾性能和可伸缩性。这是一个全栈框架,既提供了客户端 JavaScript 框架,也提供了服务器端 Ruby 框架。你对使用 Active Record 或其他 ORM 编写的领域模型有完全的访问能力。

详情参见Action Cable 概览

2.2 API 应用

Rails 现在可用于创建专门的 API 应用了。如此以来,我们便可以创建类似 TwitterGitHub 那样的 API,提供给公众使用,或者只供自己使用。

Rails API 应用通过下述命令生成:

$ rails new my_api --api

上述命令主要做三件事:

  • 配置应用,使用有限的中间件(比常规应用少)。具体而言,不含默认主要针对浏览器应用的中间件(如提供 cookie 支持的中间件)。
  • ApplicationController 继承 ActionController::API,而不继承 ActionController::Base。与中间件一样,这样做是为了去除主要针对浏览器应用的 Action Controller 模块。
  • 配置生成器,生成资源时不生成视图、辅助方法和静态资源。

生成的应用提供了基本的 API,你可以根据应用的需要配置,加入所需的功能

详情参见使用 Rails 开发只提供 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]}

创建自定义类型

你可以自定义类型,只要它们能响应值类型定义的方法。deserializecast 会在自定义类型的对象上调用,传入从数据库或控制器获取的原始值。通过这一特性可以自定义转换方式,例如处理货币数据。

查询

ActiveRecord::Base.where 会使用模型类定义的类型把值转换成 SQL,方法是在自定义类型对象上调用 serialize

这样,做 SQL 查询时可以指定如何转换值。

Dirty Tracking

通过属性的类型可以改变 Dirty Tracking 的执行方式。

详情参见文档

2.4 测试运行程序

为了增强 Rails 运行测试的能力,这一版引入了新的测试运行程序。若想使用这个测试运行程序,输入 bin/rails test 即可。

这个测试运行程序受 RSpecminitest-reportersmaxitest 等启发,包含下述主要优势:

  • 通过测试的行号运行单个测试。
  • 指定多个行号,运行多个测试。
  • 改进失败消息,也便于重新运行失败的测试。
  • 指定 -f 选项,尽早失败,一旦发现失败就停止测试,而不是等到整个测试组件运行完毕。
  • 指定 -d 选项,等到测试全部运行完毕再显示输出。
  • 指定 -b 选项,输出完整的异常回溯信息。
  • Minitest 集成,允许指定 -s 选项测试种子数据,指定 -n 选项运行指定名称的测试,指定 -v 选项输出更详细的信息,等等。
  • 以不同颜色显示测试输出。

3 Railties

变化详情参见 Changelog

3.1 删除

  • 删除对 debugger 的支持,换用 byebug。因为 Ruby 2.2 不支持 debugger。(提交
  • 删除弃用的 test:alltest:all:db 任务。(提交
  • 删除弃用的 Rails::Rack::LogTailer。(提交
  • 删除弃用的 RAILS_CACHE 常量。(提交
  • 删除弃用的 serve_static_assets 配置。(提交
  • 删除 doc:appdoc:railsdoc: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:updaterails:template 任务变成了 app:updateapp:template)。(拉取请求

3.3 重要变化

  • 添加 Rails 测试运行程序 bin/rails test。(拉取请求
  • 新生成的应用和插件的自述文件使用 Markdown 格式。(提交拉取请求
  • 添加 bin/rails restart 任务,通过 touch tmp/restart.txt 文件重启 Rails 应用。(拉取请求
  • 添加 bin/rails initializers 任务,按照 Rails 调用的顺序输出所有初始化脚本。(拉取请求
  • 添加 bin/rails dev:cache 任务,在开发环境启用或禁用缓存。(拉取请求
  • 添加 bin/update 脚本,自动更新开发环境。(拉取请求
  • 通过 bin/rails 代理 Rake 任务。(拉取请求拉取请求
  • 新生成的应用在 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_torespond_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 选项。(提交
  • 删除 assignsassert_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::IntegrationTestActionController::TestCase 弃用位置参数,换成关键字参数。(拉取请求
  • 弃用 :controller:action 路径参数。(拉取请求
  • 弃用控制器实例的 env 方法。(提交
  • 启用了 ActionDispatch::ParamsParser,而且从中间件栈中删除了。若想配置参数解析程序,使用 ActionDispatch::Request.parameter_parsers=。(提交提交

4.3 重要变化

  • 添加 ActionController::Renderer,在控制器动作之外渲染任意模板。(拉取请求
  • ActionController::TestCaseActionDispatch::Integration 的 HTTP 请求方法的参数换成关键字参数。(拉取请求
  • 为 Action Controller 添加 http_cache_forever,缓存响应,永不过期。(拉取请求
  • 为获取请求设备提供更友好的方式。(拉取请求
  • 对没有模板的动作来说,渲染 head :no_content,而不是抛出异常。(拉取请求
  • 支持覆盖控制器默认的表单构建程序。(拉取请求
  • 添加对只提供 API 的应用的支持。添加 ActionController::API,在这类应用中取代 ActionController::Base。(拉取请求
  • ActionController::Parameters 不再继承自 HashWithIndifferentAccess。(拉取请求
  • 减少 config.force_sslconfig.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_whenstale? 支持解析记录集合。(拉取请求
  • ActionController::Live 变成一个 ActiveSupport::Concern。这意味着,不能直接将其引入其他模块,而不使用 ActiveSupport::Concern 扩展,否则,ActionController::Live 在生产环境无效。有些人还可能会使用其他模块引入处理 Warden/Devise 身份验证失败的特殊代码,因为中间件无法捕获派生的线程抛出的 :warden 异常——使用 ActionController::Live 时就是如此。(详情
  • 引入 Response#strong_etag=#weak_etag=,以及 fresh_whenstale? 的相应选项。(拉取请求

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-localinput 标签。(拉取请求

6 Action Mailer

变化详情参见 Changelog

6.1 删除

  • 删除邮件视图中弃用的 *_path 辅助方法。(提交
  • 删除弃用的 deliverdeliver! 方法。(提交

6.2 重要变化

  • 查找模板时会考虑默认的本地化设置和 I18n 后备机制。(提交
  • 为生成器创建的邮件程序添加 _mailer 后缀,让命名约定与控制器和作业相同。(拉取请求
  • 添加 assert_enqueued_emailsassert_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_classsymbolized_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#tablesSchemaCache#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。(提交
  • enum 添加 :_prefix/:_suffix 选项。(拉取请求拉取请求
  • ActiveRecord::Relation 添加 #cache_key 方法。(拉取请求
  • timestamps 默认的 null 值改为 false。(提交
  • 添加 ActiveRecord::SecureToken,在模型中使用 SecureRandom 为属性生成唯一令牌。(拉取请求
  • drop_table 添加 :if_exists 选项。(拉取请求
  • 添加 ActiveRecord::Base#accessed_fields,在模型中只从数据库中选择数据时快速查看读取哪些字段。(提交
  • ActiveRecord::Relation 添加 #or 方法,允许在 WHEREHAVING 子句中使用 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_sourcesconnection.data_source_exists?。这两个方法判断什么关系可以用于支持 Active Record 模型(通常是表和视图)。(拉取请求
  • 允许在 YAML 固件文件中设定模型类。(拉取请求
  • 生成数据库迁移时允许把 uuid 用作主键。(拉取请求
  • 添加 ActiveRecord::Relation#left_joinsActiveRecord::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 选项(最近弃用了)。现在,这些错误不再做特殊处理,而是直接冒泡,与其他回调的行为保持一致。(提交

8 Active Model

变化详情参见 Changelog

8.1 删除

8.2 弃用

  • 弃用通过返回 false 停止 Active Model 和 ActiveModel::Validations 回调链的方式。推荐的方式是 throw(:abort)。(拉取请求
  • 弃用行为不一致的 ActiveModel::Errors#getActiveModel::Errors#setActiveModel::Errors#[]= 方法。(拉取请求
  • 弃用 validates_length_of:tokenizer 选项,换成普通的 Ruby。(拉取请求
  • 弃用 ActiveModel::Errors#add_on_emptyActiveModel::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。(拉取请求
  • 允许 DelayedJobSidekiqququequeue_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_stderrsilence_streamcapturequietly。(提交
  • 删除弃用的 active_support/core_ext/big_decimal/yaml_conversions 文件。(提交
  • 删除弃用的 ActiveSupport::Cache::Store.instrumentActiveSupport::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_keyActiveSupport::Cache::MemCachedStore#escape_keyActiveSupport::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。(提交
  • DateTimeDateTime 添加 #on_weekend?#on_weekday?#next_weekday#prev_weekday 方法。(拉取请求拉取请求
  • DateTimeDateTime#next_week#prev_week 方法添加 same_time 选项。(拉取请求
  • DateTimeDateTime 添加 #yesterday#tomorrow 对应的 #prev_day#next_day 方法。
  • 添加 SecureRandom.base58,生成 base58 字符串。(提交
  • ActiveSupport::TestCase 添加 file_fixture。这样更便于在测试用例中访问示例文件。(拉取请求
  • EnumerableArray 添加 #without,返回一个可枚举对象副本,但是不含指定的元素。(拉取请求
  • 添加 ActiveSupport::ArrayInquirerArray#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_lastArray#third_to_last 方法。(拉取请求
  • 发布 ActiveSupport::ExecutorActiveSupport::Reloader API,允许组件和库管理并参与应用代码的执行以及应用重新加载过程。(拉取请求
  • ActiveSupport::Duration 现在支持使用和解析 ISO8601 格式。(拉取请求
  • 启用 parse_json_times 后,ActiveSupport::JSON.decode 支持解析 ISO8601 本地时间。(拉取请求
  • ActiveSupport::JSON.decode 现在解析日期字符串后返回 Date 对象。(拉取请求
  • TaggedLogging 支持多次实例化日志记录器,避免共享标签。(拉取请求

11 荣誉榜

得益于众多贡献者,Rails 才能变得这么稳定和强健。向他们致敬!

英语原文还有 Rails 4.24.14.0 等版本的发布记,由于版本旧,不再翻译,敬请谅解。——译者注

反馈

我们鼓励您帮助提高本指南的质量。

如果看到如何错字或错误,请反馈给我们。 您可以阅读我们的文档贡献指南。

您还可能会发现内容不完整或不是最新版本。 请添加缺失文档到 master 分支。请先确认 Edge Guides 是否已经修复。 关于用语约定,请查看Ruby on Rails 指南指导

无论什么原因,如果你发现了问题但无法修补它,请创建 issue

最后,欢迎到 rubyonrails-docs 邮件列表参与任何有关 Ruby on Rails 文档的讨论。

中文翻译反馈

贡献:https://github.com/ruby-china/guides