Rails 2.1 の新機能

RubyFlowで紹介されていた、Rail Spikes: Rails gets more matureの翻訳。誤訳の指摘はコメントで。

Posted by Luke on Friday, May 02

Rails 2.1 is right around the corner. I've been following the new features in Edge Rails and eagerly looking forward to this release. Rails 2.1 includes a number of features that will make developers' lives easier. Here's a few of my favorites.

Rails 2.1 はもうすぐそこに来ている。私はずっと Edge Rails での新機能を追っかけてて、このリリースを切望している。Rails 2.1 は、開発者の暮らしを楽にしてくれるような数多くの機能を含んでいる。ここでは私が気にいっているいくつかを紹介しよう。

Necessary directories created if they don't exist

Neither Mercurial nor Git track empty directories. This is a pain with Rails, because you have to create a file in the log directory to make sure it gets created when you check out code, otherwise Rails won't start. This is no longer needed, because Rails will create necessary directories if they don't exist.

必要なディレクトリが存在しなければ作成される

Mercurial も Git も、空のディレクトリは管理対象ではない。これが Rails にとっては都合が悪い。なぜなら、コードをチェックアウトしたときにログディレクトリが必ず作られてる状態にするために、自分でログディレクトリに〔訳注: ダミーの〕ファイルを作成しなければいけないから。これがもう必要なくなった。なぜなら、必要なディレクトリがなければ Rails が作成してくれるからである。

Time zone support

Time zones are a huge pain in any application, in any language because they are just plain confusing. But ya gotta do it. In Rails, the solution used to be using the TzTime and TzInfoTimeZone plugins. Rails 2.1 adds support for tracking Time objects with their time zone. This is going to make everyones' lives a lot easier. Check out Geoff Buesing's in-depth tutorial.

タイムゾーンのサポート

タイムゾーンはとても混同しやすいため、どのアプリケーションでも、またどの言語でも頭痛のタネである。けど大丈夫。Rails ではかつて、TzTime と TzInfoTimeZone プラグインを使った解決方法が存在した。Rails 2.1 では Time オブジェクトのタイムゾーンを追跡する機能が加わった。これはすべての人の暮らしに大きなゆとりをもたらすだろう。Geoff Buesing の詳細なチュートリアルをご覧あれ。

Partial updates and "dirty" tracking

Two features that I knew and loved in our home-brew ORM from my former life as a Java developer have made it into Rails.

With dirty objects you can know if you need to persist an object, and which attributes have changed, and what an attribute's previous value was. This will be great for user messages and validations!

In Rails 2.1, ActiveRecord can update only the attributes which have changed. This can (sometimes) put your objects into an inconsistent state, but partial updates improve performance, especially when you have big TEXT or BLOB attributes that haven't changed. Use optimistic locking to prevent users from stomping on each others' changes.

部分的な更新と "ダーティ" な追跡

私が以前 Java 開発者だったときに、自分たちの自家製 ORM でとても気に入っていた機能が 2 つ、Rails に実装された。

ダーティオブジェクトを使うことで、オブジェクトを保存する必要があるかどうか、またどの属性が変更されたのか、変更される前の値は何だったのか、といったことがわかるようになった。これはユーザメッセージとバリデーションでは大きく役立つ機能だ!

Rails 2.1 では、ActiveRecord変更された属性だけを更新する。これは (ときどき) オブジェクトを矛盾のある状態にするかもしれない。しかし部分的な更新はパフォーマンスを改善する。大きなサイズの TEXT や BLOB があってそれらが更新されない場合は特にだ。〔訳注: 複数のオブジェクトがあったとしてそれらが〕互いの変更を潰し合うことを避けるためには、楽観的ロックを使おう。

Timestamped migrations

With all this distributed SCM going on, the classic problem of messed up migrations gets way worse. I talked about solutions to this in my talk at acts_as_conference, one of which was timestamped migrations. Timestamped migrations allow interleaved migrations. As long as those migrations don't conflict with each other, they can be applied in any order. This has been added to Rails. Nice!

タイムスタンプマイグレーション

分散 SCM を使うようになってから、マイグレーションがおかしくなるという古くからある問題が、より一層悪くなった。私は acts_as_conference でのトークで、この問題の解説策について話した。そのうちのひとつがタイムスタンプマイグレーションである。タイムスタンプマイグレーションを使うと、交互的なマイグレーションが可能になる。これらのマイグレーションが互いに衝突しない限り、どんな順序でも適用できる。この機能が Rails に追加された。ステキ!

Better gem dependency and unpacking

I am a big fan of the vendor everything approach to gems because I got burned way too many times by missing gems.

But it doesn't always work (for example, gems which must be natively compiled are a problem), and you have to install one of the various vendor everything plugins -- and everyone seems to use a different one. In Rails 2.1, gem unpacking is built in with rake gems:unpack GEM=gemname. (more info)

And for those gems that don't work, you can list them as a dependency. Your app will fail to start if the gem is not installed. Fail early, fail often!

よりよい Gem 依存性とアンパッケージ

私は、gems をvendor everything アプローチ〔訳注: 必要な gems パッケージをすべて vendor にぶち込むこと〕の大ファンである。なぜなら、gems が見つからないことで多くの時間を無駄にしたからだ。
しかしそれらがいつもうまく動くとは限らないし (たとえば、ネイティブコードにコンパイルしなければならない gems がそうである)、さまざまな vendor everything プラグインからひとつをインストールする必要がある -- そしてみんな違うものを使っているようだ。Rails 2.1 では、gem unpacking が組み込みになり、rake gems:unpack GEM=名前 で使えるようになった (詳細はこちら)。〔訳注: rake gems:unpack は gems パッケージを vendor ディレクトリに解凍する機能。〕

また動作しない gems は、依存先として一覧できる。gem がインストールされていない場合は自分のアプリが起動しないだろう。

Text helpers usable outside the view

You can now use helpers without including them into your class. Hurray!

テキストヘルパーがビュー以外でも利用可能に

ヘルパーが、自分のクラスに include する必要なしに使えるようになった。イヤッホー!