升级到 Rails 4,你的应用需要准备什么? 已翻译 100%

oschina 投递于 2013/01/02 10:52 (共 26 段, 翻译完成于 01-06)
阅读 8631
收藏 28
11
加载中

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

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

Tom-Lin
翻译于 2013/01/02 11:46
1

升级的方式

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

红薯
翻译于 2013/01/02 12:08
1

废弃 Deprecations

一些方法将在 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,那需要做多点工作。

红薯
翻译于 2013/01/02 12:11
2

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

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

红薯
翻译于 2013/01/02 12:14
1

例如:

gem 'ruby18-only-gem', :platforms => :ruby_18
gem 'ruby19-only-gem', :platforms => :ruby_19
#More on this can be seen in the Bundler manpages:
#http://gembundler.com/man/gemfile.5.html#PLATFORMS-platforms-

关于 1.8 和 1.9 之间的改变可看 Peter Cooper 写的这篇文章 the Ruby 1.9 walkthrough . 强烈推荐!

红薯
翻译于 2013/01/02 12:15
1

不再有 vendor/plugins

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

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

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

这里是关于废弃插件的说明 commit

红薯
翻译于 2013/01/02 12:19
1

路由匹配

关于路由,匹配方法不再作为是 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"

红薯
翻译于 2013/01/02 20:39
1

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,无需动态的评估。

红薯
翻译于 2013/01/02 20:43
2

被移除的代码

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

被删除的代码包括:


红薯
翻译于 2013/01/02 20:45
1

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

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

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

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

  • 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 环境,通过警告信息来帮你的代码适应于最新版本的语法。

红薯
翻译于 2013/01/02 22:52
1
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(9)

Zoker
Zoker
解决了我的路由匹配上的问题,多谢!
tianshuai
tianshuai
收藏了
latpaw
latpaw
最近用rails4感觉很坑,看了这篇就了然了.
C
ChenRain
首先肯定下译者的辛苦工作,但不得不吐下槽。
首先感觉不是rails使用者翻译的(频繁出现的“评估”,其实就是常见的eval啊),

This helps avoid subtle bugs with Date or Time objects that get evaluated once, instead of being dynamically evaluated.
这应翻译为:这有助于避免使用Date或Time对象时只执行一次而不是动态执行这类的隐性问题。

另外,所有gem(以及所有rails里的关键词)都应该直接用原名,不要加中文翻译。

C
Charlsi
不错,收藏一下。
红薯
红薯

引用来自“Tom Lin”的评论

奇怪,还没翻译完,就到首页上去啦?

是啊,鼓噪大家一起来完成它!:)
王振威
王振威
不错
Tom-Lin
Tom-Lin
奇怪,还没翻译完,就到首页上去啦?
红烧土豆
红烧土豆
感谢楼主。
返回顶部
顶部