开源中国

我们不支持 IE 10 及以下版本浏览器

It appears you’re using an unsupported browser

为了获得更好的浏览体验,我们强烈建议您使用较新版本的 Chrome、 Firefox、 Safari 等,或者升级到最新版本的IE浏览器。 如果您使用的是 IE 11 或以上版本,请关闭“兼容性视图”。
升级到 Rails 4,你的应用需要准备什么? - 技术翻译 - 开源中国社区

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

标签: Rails
oschina 推荐于 5年前 (共 26 段, 翻译完成于 01-06) 评论 9
收藏  
28
推荐标签: Rails 待读

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

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

Tom-Lin
 翻译得不错哦!

升级的方式

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

红薯
 翻译得不错哦!

废弃 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,那需要做多点工作。

红薯
 翻译得不错哦!

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

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

红薯
 翻译得不错哦!

例如:

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 . 强烈推荐!

红薯
 翻译得不错哦!

不再有 vendor/plugins

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

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

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

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

红薯
 翻译得不错哦!

路由匹配

关于路由,匹配方法不再作为是 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 存在,这样有助于更平滑的迁移。

被删除的代码包括:


红薯
 翻译得不错哦!

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

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

红薯
 翻译得不错哦!
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们
评论(9)
Ctrl/CMD+Enter

感谢楼主。
奇怪,还没翻译完,就到首页上去啦?
不错

引用来自“Tom Lin”的评论

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

是啊,鼓噪大家一起来完成它!:)
不错,收藏一下。
首先肯定下译者的辛苦工作,但不得不吐下槽。
首先感觉不是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里的关键词)都应该直接用原名,不要加中文翻译。

最近用rails4感觉很坑,看了这篇就了然了.
收藏了
解决了我的路由匹配上的问题,多谢!
顶部