为你的Rails 3 准备升级到 Rails 4

一个新的 Rails 版本即将发布了,随之带来了很多的修改、依赖和新特性。

让我们看一下,要使用 Rails 4,你需要为你的应用准备些什么。

升级的方式

要为 Rails 4 做好准备最简单的方法就是让你的应用运行在 Rails 3.2 上。如果你目前还不是使用 Rails 3.2,建议使用小版本方式升级,就是说从 3.0 升级到 3.1 ,然后再从 3.1 升级到 3.2

一些方法将在 Rails 4 中被完全删除,我们应该知道这些,并事先做好准备。

Rails 4 只支持 Ruby 1.9.3+

Rails 4 将只支持 Ruby 1.9.3 或者更新的版本,因此必须确保你的应用可在 Ruby 1.9.3 版本上运行。

如果你使用的是 Ruby 1.9.x,这样升级会更加直接。

如果你还在使用 Ruby 1.8.7,那需要做多点工作。

现在大多数 gems 都可以运行在 Ruby 1.9 版本,或者也有了替代品。例如 rvm 或rbenv 这样的工具可以帮助我们的应用程序运行在多个 Ruby 的版本。

在你的 Gemfile 中使用条件语句可以方便的处理不同环境下的不同 gems,直到你完全移植到 Ruby 1.9.x 上。

gem 'ruby18-only-gem', :platforms => :ruby_18
gem 'ruby19-only-gem', :platforms => :ruby_19

去掉 vendor/plugins

Rails 4 将删除 Rails::Plugins 类,所以将不会再加载 vender/plugins 目录下的任何代码。

大多数应用应该依赖于 gems 而不是插件。但如果你在 vender/plugins 中还有一些代码,你有两种选择:

  • 改用 gem 方式实现,多数插件已经有了 gem 版本,如果没有你可以在 Gemfile 中通过 :gitor:pathoptions 来引用插件
  • 移到 lib/your_pluginand ,然后在 onconfig/initializers 初始化

路由

关于路由,匹配方法不再作为是 catch-all 选项,你可以指定需要响应什么 HTTP 方法,包括 GET/POST 之类的。

#Rails 3.2
match "/users/:id" => "users#show"
#Rails 4.0
match "/users/:id" => "users#show", via: :get
#or specify multiple verbs
match "/users" => "users#index", via: [:get, :post]

另外一个更好兼容 Rails 3.2 的方法是显式的指定 HTTP 方法,是 GET 或者 POST,或者是其他的方法。这样你就可以兼容现在的版本和 Rails 4.0.

#Rails 3.2 and 4.0 compatible
get "/users/:id" => "users#show"
# multiple verbs
get "/users" => "users#index"
post "/users" => "users#index"

ActiveRecord

ActiveRecord 范围需要一个 Callable 对象。

在 Rails 4 中,所有 ActiveRecord 范围必须使用一个 callable 对象来定义:

#Rails 3.2
scope :recent, where(created_at: Time.now - 2.weeks)
#Rails 4
scope :recent, -> { where("created_at > ?", Time.now - 2.weeks).order("created_at desc") }
scope :active, -> { where(status: 'active') }

这个可避免一些关于日期和时间对象的微小 bug,无需动态的评估。

被移除的代码

在 Rails 4 中有很多代码会被删除,别担心,因为大多数被删除的代码还会作为独立的 gems 存在,这样有助于更平滑的迁移。

被删除的代码包括:

  • ActiveResource
  • ActiveRecord Observers and ActionController Sweepers
  • ActiveRecord::SessionStore
  • ActiveModel Mass Assignment Sanitizer
  • Action Caching
  • Page Caching
  • Hash-based and dynamic finders

特别 值得一提的 注意事项:

Activerecord-deprecated-finders 是 Rails 4.0 中默认提供废弃功能的依赖包,但它也将在 4.1 版本中被删除。因此你需要密切关注所有的警告信息,并开始修复这些警告。

Rails 指南 提供一个很有用的解释,关于在大多数情况下如何修改动态查找器:

所有动态的方法除了 find by … 和 find by …! 外都已废弃,你可以使用如下的替代方法:

  • find_all_by_…改为 where(…).
  • find_last_by_…改为 where(…).last.
  • scoped_by_…改为 where(…).
  • find_or_initialize_by_…改为 where(…).first_or_initialize.
  • find_or_create_by_…改为 find_or_create_by(…) 或者 where(…).first_or_create.
  • find_or_create_by_…!改为 find_or_create_by!(…) 或者 where(…).first_or_create!.

所有的那些 gems 都可以帮你实现平滑的迁移。我的建议是:对一个完全的 Rails 4 环境,通过警告信息来帮你的代码适应于最新版本的语法。

新特性

现在该是介绍最有趣的部分了!

Rails 4 增加了大量的新特性,好消息是这些新特性都可以在 Rails 3.2 中通过 gems 方式获取。同时 Rails 4 也提供了预览版不可方便进行升级测试。

下面我们来看看这些新特性。

  • Strong Parameters
  • Cache Digests and Russian Doll Caching
  • Declarative ETags
  • Turbolinks
  • Concerns

Models 和 Controller

Rails 4 默认增加两个新的文件夹:

app/controllers/concerns 
app/models/concerns

一般代码是存在于 lib 目录,这些新的目录让事情看起来更加简洁和容易查找。

要完成这点修改,你仅需简单的把下面这行代码添加到 config/application.rb

config.autoload_paths += Dir["#{config.root}/app/controllers/concerns", "#{config.root}/app/models/concerns"]

然后再把你的 model 和 controller 等这些模块移到这些目录中。

Dalli 成为了 memcache 客户端

Dalli 将替换掉掉 memcache-client 而成为 gem 的默认缓存客户端。

这将带来以下几点改进:

  • 这将比 memcache-client 快了将近 20%
  • 可以处理故障转移和恢复,并能调节超时设置
  • 这是线程安全的
  • 使用了更新的 memcached 二进制协议

现在要在你的应用中测试这项改动,你仅需简单地做以下两点:

在你的 Gemfile 里:

gem 'dalli'

config/environments/production.rb(或者是你使用的 memcached环境 ):

config.cache_store = :dalli_store
# just be sure to change this back to :mem_cache_store when upgrading to Rails 4

要注意一件事:Dalli 依赖于 memcached 1.4+,因此如果你使用了旧的 memcached 版本,那么你也要先升级你的 memcached

默认启用线程安全

在新的 Rails 应用中,产品模式下默认启用线程安全选项,你可设置 config.cache_classes 和 config.eager_loader 值为 false 来关闭它。

这里应该不会有太多问题,除非应用过分的依赖于线程安全。

你现在就可以在应用中启用 threadsafe! 选项来查看具体表现。当升级到 Rails 4 后你就会看到一个警告,你可以移除这个配置行。

总结

本文把 即将发布的 Rails 4 的主要更新内容都包含了。在这些更新中,大多数应用都能够轻易地升级到 Rails 4。但不管怎么说,Rails 4 还在积极的开发中,因此,将来还会有一些其他的更新。我将会持续关注并不断更新本文。

This entry was posted in ruby on rails. Bookmark the permalink.

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>