更多内容请访问 rubyonrails.org:

Ruby on Rails 4.0 发布说明

Rails 4.0 的亮点

  • 推荐 Ruby 2.0;要求 1.9.3+
  • 强参数
  • Turbolinks
  • 俄罗斯套娃缓存

这些发布说明仅涵盖主要更改。要了解各种错误修复和更改,请参阅更改日志或查看 GitHub 上主 Rails 存储库中的提交列表

1. 升级到 Rails 4.0

如果您正在升级现有应用程序,最好在升级之前有良好的测试覆盖率。您还应该首先升级到 Rails 3.2(如果您尚未升级),并确保您的应用程序在尝试升级到 Rails 4.0 之前仍然按预期运行。在升级 Ruby on Rails 指南中列出了升级时需要注意的事项。

2. 创建 Rails 4.0 应用程序

# You should have the 'rails' RubyGem installed
$ rails new myapp
$ cd myapp

2.1. 嵌入 Gem

Rails 现在在应用程序根目录中使用 Gemfile 来确定您的应用程序启动所需的 gem。此 GemfileBundler gem 处理,然后安装所有依赖项。它甚至可以将所有依赖项本地安装到您的应用程序中,以便它不依赖于系统 gem。

更多信息:Bundler 主页

2.2. 前沿开发

BundlerGemfile 使冻结您的 Rails 应用程序变得轻而易举,使用新的专用 bundle 命令。如果您想直接从 Git 仓库捆绑,可以传递 --edge 标志

$ rails new myapp --edge

如果您本地签出了 Rails 仓库并希望使用它生成应用程序,您可以传递 --dev 标志

$ ruby /path/to/rails/railties/bin/rails new myapp --dev

3. 主要功能

Rails 4.0

3.1. 升级

  • Ruby 1.9.3 (提交) - 推荐 Ruby 2.0;要求 1.9.3+
  • 新弃用策略 - 弃用功能在 Rails 4.0 中是警告,并将在 Rails 4.1 中移除。
  • ActionPack 页面和动作缓存 (提交) - 页面和动作缓存被提取到一个单独的 gem 中。页面和动作缓存需要太多的手动干预(在底层模型对象更新时手动使缓存失效)。相反,请使用俄罗斯套娃缓存。
  • ActiveRecord 观察者 (提交) - 观察者被提取到一个单独的 gem 中。观察者仅用于页面和动作缓存,并可能导致意大利面条式代码。
  • ActiveRecord 会话存储 (提交) - ActiveRecord 会话存储被提取到一个单独的 gem 中。将会话存储在 SQL 中成本很高。相反,请使用 cookie 会话、memcache 会话或自定义会话存储。
  • ActiveModel 批量赋值保护 (提交) - Rails 3 批量赋值保护已弃用。相反,请使用强参数。
  • ActiveResource (提交) - ActiveResource 被提取到一个单独的 gem 中。ActiveResource 未被广泛使用。
  • vendor/plugins 已移除 (提交) - 使用 Gemfile 管理已安装的 gem。

3.2. ActionPack

  • 强参数 (提交) - 仅允许授权参数更新模型对象 (params.permit(:title, :text))。
  • 路由关注点 (提交) - 在路由 DSL 中,提取公共子路由(/posts/1/comments/videos/1/comments 中的 comments)。
  • ActionController::Live (提交) - 使用 response.stream 流式传输 JSON。
  • 声明式 ETag (提交) - 添加控制器级别的 etag 添加,这些添加将成为动作 etag 计算的一部分。
  • 俄罗斯套娃缓存 (提交) - 缓存视图的嵌套片段。每个片段根据一组依赖项(缓存键)过期。缓存键通常是模板版本号和模型对象。
  • Turbolinks (提交) - 仅提供一个初始 HTML 页面。当用户导航到另一个页面时,使用 pushState 更新 URL,并使用 AJAX 更新标题和正文。
  • ActionView 与 ActionController 解耦 (提交) - ActionView 已与 ActionPack 解耦,并将在 Rails 4.1 中移动到单独的 gem。
  • 不再依赖 ActiveModel (提交) - ActionPack 不再依赖 ActiveModel。

3.3. 常规

  • ActiveModel::Model (提交) - ActiveModel::Model,一个混合模块,使普通的 Ruby 对象能够直接与 ActionPack 协同工作(例如,用于 form_for)。
  • 新作用域 API (提交) - 作用域必须始终使用可调用对象。
  • Schema 缓存转储 (提交) - 为了提高 Rails 启动时间,不再直接从数据库加载 schema,而是从转储文件加载 schema。
  • 支持指定事务隔离级别 (提交) - 选择重复读还是改进性能(减少锁定)更重要。
  • Dalli (提交) - 将 Dalli memcache 客户端用于 memcache 存储。
  • 通知开始和结束 (提交) - Active Support 仪表报告开始和结束通知给订阅者。
  • 默认线程安全 (提交) - Rails 可以在线程化应用服务器中运行,无需额外配置。

检查您正在使用的 gem 是否线程安全。

  • PATCH 动词 (提交) - 在 Rails 中,PATCH 替换 PUT。PATCH 用于资源的局部更新。

3.4. 安全性

  • match 不再捕获所有 (提交) - 在路由 DSL 中,match 要求指定 HTTP 动词。
  • HTML 实体默认转义 (提交) - 在 erb 中渲染的字符串会被转义,除非使用 raw 包裹或调用 html_safe
  • 新的安全头 (提交) - Rails 在每个 HTTP 请求中发送以下头:X-Frame-Options(通过禁止浏览器将页面嵌入框架来防止点击劫持)、X-XSS-Protection(要求浏览器停止脚本注入)和 X-Content-Type-Options(防止浏览器将 jpeg 作为 exe 打开)。

4. 功能提取为 gem

在 Rails 4.0 中,一些功能已被提取为 gem。您只需将提取的 gem 添加到您的 Gemfile 即可恢复其功能。

5. 文档

  • 指南已用 GitHub Flavored Markdown 重写。

  • 指南采用响应式设计。

6. Railties

详细更改请参阅 更改日志

6.1. 显著更改

  • 新的测试位置 test/modelstest/helperstest/controllerstest/mailers。同时添加了相应的 rake 任务。 (Pull Request)

  • 您的应用程序的可执行文件现在位于 bin/ 目录中。运行 rake rails:update:bin 以获取 bin/bundlebin/railsbin/rake

  • 默认开启线程安全

  • 通过向 rails new 传递 --builder(或 -b)来使用自定义构建器的功能已移除。请考虑使用应用程序模板代替。 (Pull Request)

6.2. 弃用

  • config.threadsafe! 已弃用,取而代之的是 config.eager_load,它提供了对预加载内容的更细粒度控制。

  • Rails::Plugin 已移除。不再将插件添加到 vendor/plugins,而是使用 gem 或带路径或 git 依赖项的 bundler。

7. Action Mailer

详细更改请参阅 更改日志

7.1. 显著更改

7.2. 弃用

8. Active Model

详细更改请参阅 更改日志

8.1. 显著更改

  • 添加 ActiveModel::ForbiddenAttributesProtection,一个简单的模块,用于在传递非授权属性时保护属性免受批量赋值。

  • 添加了 ActiveModel::Model,一个混合模块,使 Ruby 对象能够直接与 Action Pack 协同工作。

8.2. 弃用

9. Active Support

详细更改请参阅 更改日志

9.1. 显著变更

  • ActiveSupport::Cache::MemCacheStore 中,用 dalli 替换了已弃用的 memcache-client gem。

  • 优化 ActiveSupport::Cache::Entry 以减少内存和处理开销。

  • 现在可以按区域设置定义词形变化。singularizepluralize 接受区域设置为额外参数。

  • 如果接收对象未实现该方法,Object#try 现在将返回 nil 而不是引发 NoMethodError,但您仍然可以通过使用新的 Object#try! 来获得旧行为。

  • 当给定无效日期时,String#to_date 现在会引发 ArgumentError: invalid date,而不是 NoMethodError: undefined method 'div' for nil:NilClass。它现在与 Date.parse 相同,并且接受比 3.x 更多无效日期,例如

    # ActiveSupport 3.x
    "asdf".to_date # => NoMethodError: undefined method `div' for nil:NilClass
    "333".to_date # => NoMethodError: undefined method `div' for nil:NilClass
    
    # ActiveSupport 4
    "asdf".to_date # => ArgumentError: invalid date
    "333".to_date # => Fri, 29 Nov 2013
    

9.2. 弃用

  • 弃用 ActiveSupport::TestCase#pending 方法,改为使用 minitest 的 skip

  • ActiveSupport::Benchmarkable#silence 已弃用,因为它缺乏线程安全性。它将在 Rails 4.1 中移除,没有替代品。

  • ActiveSupport::JSON::Variable 已弃用。为自定义 JSON 字符串文字定义您自己的 #as_json#encode_json 方法。

  • 弃用兼容性方法 Module#local_constant_names,改为使用 Module#local_constants(它返回符号)。

  • ActiveSupport::BufferedLogger 已弃用。请使用 ActiveSupport::Logger 或 Ruby 标准库中的日志记录器。

  • 弃用 assert_presentassert_blank,改为使用 assert object.blank?assert object.present?

10. Action Pack

详细更改请参阅 更改日志

10.1. 显著更改

  • 更改了开发模式下异常页面的样式。此外,在所有异常页面中还会显示引发异常的代码行和片段。

10.2. 弃用

11. Active Record

详细更改请参阅 更改日志

11.1. 显著更改

  • 改进了编写 change 迁移的方式,使旧的 updown 方法不再必要。

    • 只要提供了必要的信息,drop_tableremove_column 方法现在是可逆的。remove_column 方法曾经接受多个列名;请改用 remove_columns(它不可逆)。change_table 方法也是可逆的,只要其块不调用 removechangechange_default
    • 新方法 reversible 使得可以在向上或向下迁移时指定要运行的代码。请参阅迁移指南
    • 新方法 revert 将回滚整个迁移或给定的块。如果向下迁移,则正常运行给定的迁移/块。请参阅迁移指南
  • 添加了 PostgreSQL 数组类型支持。任何数据类型都可以用于创建数组列,并提供完整的迁移和 schema dumper 支持。

  • 添加 Relation#load 以显式加载记录并返回 self

  • Model.all 现在返回一个 ActiveRecord::Relation,而不是记录数组。如果您确实需要一个数组,请使用 Relation#to_a。在某些特定情况下,这可能会在升级时导致问题。

  • 添加了 ActiveRecord::Migration.check_pending!,如果存在待处理的迁移,则会引发错误。

  • 添加了对 ActiveRecord::Store 的自定义编码器支持。现在您可以像这样设置您的自定义编码器

    store :settings, accessors: [ :color, :homepage ], coder: JSON
    
  • mysqlmysql2 连接将默认设置 SQL_MODE=STRICT_ALL_TABLES 以避免静默数据丢失。这可以通过在 database.yml 中指定 strict: false 来禁用。

  • 移除 IdentityMap。

  • 移除 EXPLAIN 查询的自动执行。选项 active_record.auto_explain_threshold_in_seconds 不再使用,应该移除。

  • 添加了 ActiveRecord::NullRelationActiveRecord::Relation#none,为 Relation 类实现了空对象模式。

  • 添加了 create_join_table 迁移助手以创建 HABTM 连接表。

  • 允许创建 PostgreSQL hstore 记录。

11.2. 弃用

  • 弃用了旧式基于哈希的查找器 API。这意味着以前接受“查找器选项”的方法不再接受。

  • 除了 find_by_...find_by_...! 之外的所有动态方法都已弃用。以下是您如何重写代码

    • find_all_by_... 可以使用 where(...) 重写。
    • find_last_by_... 可以使用 where(...).last 重写。
    • scoped_by_... 可以使用 where(...) 重写。
    • find_or_initialize_by_... 可以使用 find_or_initialize_by(...) 重写。
    • find_or_create_by_... 可以使用 find_or_create_by(...) 重写。
    • find_or_create_by_...! 可以使用 find_or_create_by!(...) 重写。

12. 鸣谢

请参阅Rails 贡献者完整列表,感谢许多人花费大量时间使 Rails 成为一个稳定而健壮的框架。向他们所有人致敬。



回到顶部