Railsで削除確認のconfirmダイアログを出す

Rails2で記事一覧画面から直接記事を削除するような場合。

削除リンクをクリックすると「削除してよろしいですか?」が出てOKなら削除、キャンセルなら何もしない、というよくある処理。

テンプレート:

<%= link_to_remote("削除", :url => {:controller => "article", :action => "delete", :id => article},
  :update => "article_#{article.id}", :confirm => '削除してよろしいですか?') %>

出力:

<a href="#" onclick="if (confirm('削除してよろしいですか?')) { new Ajax.Updater('article_11', '/article/delete/11', {asynchronous:true, evalScripts:true}); }; return false;">削除</a>

TwitterのURLからstatusを抜き出す正規表現

tweetのURLからstatusを抜き出す正規表現を考えていた。

tweetのURLには幾つか種類があって基本的に次の4つの要素とその組み合わせのようだ。

  • 昔の書式:
    http://twitter.com//ysakaki/status/129076541425586176
  • #!が挟まる書式:
    http://twitter.com/#!/ysakaki/status/129076541425586176
  • statusじゃなくてstatusesな書式:
    http://twitter.com/#!/ysakaki/statuses/129076541425586176
  • 更にhttps対応した書式:
    https://twitter.com/#!/ysakaki/statuses/129076541425586176

Rubyで言うと下記で(\d+)の取得結果$4でstatusが取得できた。

tweet_url = "http://twitter.com/#!/ysakaki/status/129076541425586176"
tweet_url =~ /^http(s*):\/\/twitter.com\/(.*)\/(status|statuses)\/(\d+)$/ 
puts $4
129076541425586176

SUICA定期発券のバグに遭遇したかも(と思ったら操作の問題だった)

どうも、バグではないかと思う(断定はしないが)。

私は普段京王線→JR原宿駅の一ヶ月定期を使用している。それが、定期を更新した所他人の区間で更新されるという現象にぶちあたった。

具体的には山手線某駅→昭和島、となっている。昭和島という駅がどこかわからなくてググったくらいなので心当たりは無い。

某駅→(山手線)→浜松町駅→(東京モノレール)→昭和島駅、というルートらしい。

新規定期の場合乗り換え路線を指定したりする操作が必要だから、新規で誤操作はありえない。定期継続のパターンだろう。

継続操作時に自分では延長期間と利用開始日を選んだ記憶しかないのだが一体…。明日みどりの窓口へ行ってみる。

後日談

JRのみどりの窓口で調べてもらったのでご報告。新規定期扱いで某駅→(山手線)→浜松町駅→(東京モノレール)→昭和島駅というルートになっていたことを確認。

結果的に、日にちをさかのぼって本来ルートの定期券を再発行し、誤って引かれていたチャージ分を戻す処理をしていただいた。

色々詳細は省くけれど可能性としては
1.前の人が新規定期券を発行しようとして、ルート設定した所でやめてしまった
2.その後私がカードを差し込んだ。
3.画面が切り替わって「何ヶ月分の定期か」「何日から有効にするか」の画面になった(のできづかなかった)

という場合起こりうるのではないか、とのことだった。新規定期の場合は途中でカードを差すことが可能とのこと。私は定期新規作成の操作はしていないのは確実だが、最初に定期継続のボタンを選んでからスタートしたかどうか、区間が表示されたかは覚えていない。これは状況としては一致すると思う。

従って、バグではなく前の人と私との操作タイミングの問題だったと思う。私は前の人の画面が途中で残っていないという先入観があったから、注意を払っていなかった。おそらく一定時間操作がなければ前の人の操作はクリアされるはずがすかさず?カードを差し込んでしまったため、新規作成の続きに入ってしまったのではないだろうか。

FizzBuzz問題をRubyで書くと

FizzBuzz問題とはこれ。

1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。

Step1
vi fizzbuzz.rbして以下を記述する。100.eachはさすがに通らなかった。iだけだと0から99表示になるのでi+1する。

100.times do |i|
 puts i+1
end

ruby fizzbuzz.rbを実行すると1〜99が表示される。

完成した。

#vi fizzbuzz.rb
100.times do |i|
  i += 1
  if i % 3 == 0 and i % 5 == 0
    puts "FizzBuzz"
  elsif i % 3 == 0
    puts "Fizz"
  elsif i % 5 == 0
    puts "Buzz"
  else 
    puts i
  end
end

が、仕様は満たしているが気に入らない。重複が多い。putsが何回も出てくるしi+=1とかダサい…。@ikmさんにしたがってちょっと直した。次はif文をどうにかしたいね。

#vi fizzbuzz.rb
1.upto 100 do |i|
  t = ""
  if i % 3 == 0 and i % 5 == 0
    t += "FizzBuzz\n"
  elsif i % 3 == 0
    t += "Fizz\n"
  elsif i % 5 == 0
    t += "Buzz\n"
  else
    t += "#{i}\n"
  end
  puts t
end

RailsのViewで奇数・偶数の表示制御

何回調べても忘れるのでメモ。テーブルの行毎に背景を変えたい場合の制御方法。

Railsではcycleというhelperメソッドが用意されている。
http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-cycle

@items = [1,2,3,4]
<table>
  <% @items.each do |item| -%>
  <tr class="<%= cycle("even", "odd") -%>">
    <td>item</td>
  </tr>
  <% end -%>
</table>

で出力が

<table>
  <tr class="odd">
    <td>1</td>
  </tr>
  <tr class="even">
    <td>2</td>
  </tr>
  <tr class="odd">
    <td>3</td>
  </tr>
  <tr class="even">
    <td>4</td>
  </tr>
</table>

今から始める地獄のnamed_scope

これはRuby Advent Calendar jp: 2010の参加エントリです。前日は@sasata299さんの未経験で初めてgemを作ってみたので晒してみるでした。

地「お、この話についてこれるんだー」始めに
ホントは私もミサワ風に「お、この話に付いてこれるんだ」的話をしたいんだけど今回はRailsのActiveRecordの機能、named_scopeの話をします。

最近twitterでnamed_scope便利!という声を見ました。Ruby on Rails 2.1から入った機能なのでそれ以前から触っていた人は使っていないのかな、ということで今更ながらnamed_scopeのおさらいをします。

named_scopeの機能

named_scopeの概要は以下のとおり

  • Rails2.1以降で使える
  • 検索条件をスコープごとにまとめて定義できる
  • メソッドチェーン的に集合演算が可能

ではサンプル。

class Article < ActiveRecord::Base
  named_scope( :active,
   :conditions => ["deleted=?", false]
  )
  named_scope( :public,
    :conditions => 
    ["start_date >= ? and (end_date is null or end_date =< ?)",
    Date.today,Date.today]
  )

  #named_scopeを使わない場合
  get_active
    return find(:all,
      :conditions = ["deleted=?", false],
      :order => "id desc"
    )
  end

  #named_scopeを使わない場合
  get_article(id)
    return find(:first,
      :conditions => 
      ["deleted=? and start_date >= ? and (end_date is null or end_date =< ? ) and id =?",
      false,Date.today,Date.today,id]
    )
  end
end

これらを、コントローラから呼ぶと

#named_scopeを使わない場合
articles = Article.get_active
article = Article.get_article(params[:id])

#named_scopeを使った場合
articles = Article.active(:all,:order=>"id desc")
article = Article.active.public.find(params[:id]) #集合演算


まとめ

業務上は論理削除や記事の掲載期間のようにお約束的に繰り返されるfind条件がたくさんでてきます。それらをnamed_scopeでDRYに用意しておくことで1.named_scope条件部分は検証済みになる安心 2.ソースの可読性向上が得られます。

例えば記事の掲載期間だけで一行ありますがfindの度に毎回出てくると、本来そのfindで得たい固有の条件、を見つけるのが苦痛になってきます。またフラグにはtrue/falseや0,1,2,99のように色々な持ち方がありますがactive,publicなどと名前を付けることで単純ミスを防げます。

更にincludeやorderなどもnamed_scope化できますし、引数を取って動的に処理することも可能です。

ゴクリ。これで今日からえ〜普通だと思ってた。named_scope使ってないで許されるの小学生までだよね?え〜そう?普通だと思ってた〜え〜それ普通だと思ってた〜と言えますね!
地「お、この話についてこれるんだー」

RailsDevCon開催のお知らせ

こんにちは。Mitaka.rbの榊です。

11/20(土)にRailsDevelopersConference、通称RailsDevConを開催します。詳細決定次第随時アナウンスします。

概要

  • 名称:RailsDevCon2010(れいるずでぶこん2010)
  • 日時:2010年11月20日
  • 会場:オラクル青山センター
  • 会費:無料
  • 参加登録:開始次第アナウンスします
  • 公式タグ:#RailsDevCon2010
  • 公式twitter:@RailsDevCon
  • 主催:RailsDevCon2010実行委員会(スタッフ募集中)

趣意

RailsDevConはRails関係者のためのカンファレンスです。海外のRubyConf / RailsConfに対応する存在として「日本Ruby会議」がありますが、RailsConfに対応するイベントはありませんでした。一方Rails開発者の関心として設計/アジャイル/TDD/教育/デプロイ/開発環境/プラグイン開発/etc…など多岐に渡るキーワードがあり、それぞれが一日カンファレンスできるくらいの内容を持っています。日本Ruby会議の「来年で最終回」宣言や「日本のRailsは残念」と言われる状況を受け日本でもRailsに特化したカンファレンスが必要ではと思います。

私たちはRailsが強力なツールであることを知っています。
私たちはもっと効率的に迅速にきれいに開発できると常に思っています。
私たちはRailsの普及期が終わって当たり前に仕事で使っている人が沢山いるフェーズに入ったことを知っています。

Railsのコンセプトの一つは「DRY(Don’t Repeat Yourself)」です。今回のRailsDevConがお互いのノウハウを共有し、アウトプットしていく実践的な場とすることを目指します。

Mitaka.rb#10@吉祥寺「Bistro epices」を開催しました

去る9月9日にMitaka.rb10回目を開催しました。昨年5月の初回から一年以上をかけて10回に到達。ご参加いただいている皆さん、運営に協力してくれている皆さん、会場提供している店舗の皆さんにお礼申し上げます。Rubyistがいいもん食ってさざめきながら散会していくのを見るのは私の喜びです。

自分はあまり大きなことは考えていなくて、基本的に自分がRubyKaigiやRails勉強会@tokyoで受けたホスピタリティや出会いを派生的に再生産したい。スタンド使いはスタンド使い同士勝手に惹かれ合うんだけどそれをちょっと促進する「場」になればいいな、程度です。RubyKaigiについては次のエントリで書きます。

Mitaka.rb#10開催概要

詳細はこちらより。 http://atnd.org/events/7542

昨年8月に好評だった「Bistro epices」さんを貸し切ってRubyistで懇親しようというイベントです!RubyKaigiおつかれさまでした会って感じでしょうか。

  • 日時:2010/9/9(木) 20-23時
  • 進行:20:00-22:00飲食、22:00-23:00 LT発表
  • 予算:3000円(榊が懸賞に当たったので6000円のコースの半額出すよ!→人数増えたので予算が尽きたので一人2000円ずつの補助になったよ(><)。→(株)HatchUp様の協賛により一人1000円補助が出ます!(←今ココ)

LT

  • 「群馬でWEBとRubyな生活」 by @kanayannetさん
  • 「【急募】【!緊急!】【拡散希望】【RTお願いします】【興味がなくてもリツイートを!】【賛同者求む!】【現在1人】」by 小芝(@bash0C7 )さん
  • 「美味しそうを共有するサービス『ラペコ』の紹介」by (株)KRAYの芳賀 充(@func09)さん
  • 「WordPressに足りないモノ」by 駒形 真幸(@komagata)さん
  • 「30min.(サンゼロミニッツ)で幸せな日常を」by @ysakaki

Mitaka.rb#10開催経緯

RubyKaigiも終了したしMitaka.rbやりたいがまた「でもお高いんでしょう?」と言われるのもなーと思っていたら懸賞に当たったのです。吉祥寺のいせやというのは地元ではふらっと立ち寄ってやきとりなどさくっと食べていく所として定番なんですが調べたら350席もあるらしいんですね。350席×仮に一人4000円=140万円・・・無理ヽ(´ー`)ノ。

ということでいせや貸切は諦めて吉祥寺のカジュアルフレンチ「epices」さんで開催、費用は半額補助だ!ということになりました。今回は初めての企業協賛として(株)HatchUp様から一人1000円の補助もいただき、ありがとうございました。

【速報】@coopa_ の懸賞に当たった!けど絶対10万円じゃ足りないのでスポンサー募集します!! RT: @ysakaki 当たったら吉祥寺のいせ屋を貸しきって夕方から飲み食いしたい。「来た人皆奢るよ」とか言ってみたい。それをUstしたい。 #coopa_less than a minute ago via Tweetie for Mac

@kakutaniさんから「Mitaka.rbがRubyKaigiよりお安いなんて」とのお言葉いただき感無量です(笑。

@ysakaki #rubykaigi より安いmitaka.rbだと…less than a minute ago via Echofon

Mitaka.rb#10開催風景

カウンタで談笑する@monoookiさん
カウンタで談笑

@iori0121さんと@adzuki34さん、RubyKaigiスタッフお疲れ様でした!
@iori0121 と @adzuki34さん、RubyKaigiスタッフお疲れ様でした!

カウンタ前で談笑する@ukstudioさん
カウンタ前で談笑する@ukstudioさん

@kanayannetさんLT発表中。群馬から車を飛ばして駆けつけてくださったそうです。熱い!
群馬から車を飛ばして駆けつけてくださったそうです〜!

@komagaraさんも中央線クラスタ。
@komagaraさん

@nonomuraさんと@sugamasaoさん
@nonomuraさんと@sugamasaoさん

@nogさんもご機嫌
@nogさんもご機嫌

LTでrapecoの画面をプロジェクタ投影中
rapecoの画面をプロジェクタ投影中

@komagataさんがLT発表中
@komagataさんがLT発表中

受付会計手伝っていただいた前田製作所の前田さん!いつもありがとう!
受付会計手伝っていただいた前田製作所の前田さん!

小芝さんが誕生月だったのでお祝いしましたよ!”えっ年下だったの”が拡散されて恥ずかしい(><)。

最後にepicesのシェフからご挨拶いただく。近くに二号店を出店したそうです。ごちそうさまでした!
シェフからご挨拶いただく。近くに二号店を出店したそうです!

「Bistro epices」料理

前菜

サラダの大皿。多分4人前だと思う。
サラダの大皿

前菜取り分けた所。
前菜盛り合わせ

パスタ

パスタパスタ!

メインの魚介料理

魚介料理遠景
メインの魚介料理
魚介料理取り分けてみた
魚介料理の大皿

メインの肉料理

メインの肉料理。ふたり分。

おまけ

お茶目すぎる @ukstudioさん。
お茶目すぎる@ukstudioさん

@sugamasaoさんに「一番かわいい顔して」と言ったら照れてかわいい!
「一番かわいい顔して」と言ったら照れてかわいい!

いつの間にかMacbookProに色々シール貼られてた。右上のWAVEシールと左上のなぜなぜ君。中央はtwitterのくじらさん
いつの間にかMacbookProに色々シール貼られてた。右上のWAVEシールと左上のなぞなぞ君。中央はtwitterのくじらさん

私は8月誕生日だったのに店側のサプライズでデザート盛り合わせプレートをいただいてしまった!「Bistro epices」さんありがとう!
誕生日のデザート盛り合わせプレート

写真ギャラリ

ランダム表示してます。写真は上記で使用したものと同じです。

Rails3.0リリースアナウンス超訳(2010.08.30)

2010.08.30リリースのRails3.0の公式リリースノート公式リリースアナウンス超訳です。以前Rails3.0ベータ版のリリースノートとはかなり内容が違います。原文は http://weblog.rubyonrails.org/2010/8/29/rails-3-0-it-s-done。大意が汲めればOKレベルの訳ですが、間違いや改善したほうが良い表現があればご指摘いただけると喜びます。

# 2010.09.02 追記
なんと!一生懸命訳していたのにこれはただのリリースアナウンスでリリースノートではないとのご指摘が。ということで正式なリリースノートはこちら(http://guides.rubyonrails.org/3_0_release_notes.html)を御覧ください。
#追記終わり

Rails3.0の開発が進められてきたこの2年間、最終的にリリースへ辿りつくまで我々(開発陣)には膨大なプレッシャがかかっていた。その中で我々は1600人以上のコントリビュータとともにあらゆるものを改善し、高速化し、綺麗に美しくしてきた。

第三世代のRailsは数千のコミットからなっており、何が特徴か拾い上げるのは大変すぎて不可能だ。しかしRails3の主要な変更点をあげてみよう。

新しいActiveRecordエンジン

ActiveRecordはscopeやqueryをもっと首尾一貫してわかりやすくするため、新しく「the ARel query engine」に置き換えられた。これにより幾つかの実装における複雑なqueryを構築するのがかなり簡単になった。またそのqueryが実際に必要になるまで実行されないようにもした。簡単なサンプルは以下のとおり。

users = User.where(:name => "david").limit(20)
users.where("age > 29")

# SELECT * FROM users
# WHERE name = "david" AND age > 29
# ORDER BY name
# LIMIT 20
users.order(:name).each { |user| puts user.name }

詳しくは「new ActiveRecordguide」や「Dive into Rails3: Arel video」を見て欲しい。

ActionControllerのための新しいroute

我々がRails2でコントローラをRESTベースの新しいアプローチに切り替えたとき、その試みがうまくいくように既存のrouterに新しい文法のパッチを追加した。

RESTベースの新しいアプローチは結果としてうまくいったが、Rails3では文法を改めて完全にREST方式に適合させた上で、無駄が減って柔軟になるよう刷新した。

resources :people do
  resource :avatar

  collection do
    get :winners, :losers
  end
end

# /sd34fgh/rooms
scope ':token', :token => /\w{5,5}/ do
  resources :rooms
end

# /descriptions
# /pl/descriptions
# /en/descriptions
scope '(:locale)', :locale => /en|pl/ do
  resources :descriptions
  root :to => 'projects#index'
end

詳しくは「new routing guide」を見て欲しい。

新しいActionMailer

Action Mailerはモデルとコントローラ半々から成り立つ二重人格状態だった。Rails3で我々はAction Mailerを完全にコントローラにする選択をした。それが意味するのは使い方や機能がよりAction Controllerに近づくということで、事実Action MailerとAction Controllerは基礎的なコード群を共有している。どんな感じに動くかを以下に示す。

class Notifier < ActionMailer::Base
  default :from =>
    "Highrise <system@#{APPLICATION_DOMAIN}>" 

  def new_project(digest, project, person)
    @digest, @project, @person = digest, project, person

    attachments['digest.pdf'] = digest.to_pdf
    attachments['logo.jpg']   = File.read(project.logo_path)

    mail(
      :subject => "Your digest for #{project.name}",
      :to => person.email_address_with_name
    ) do |format|
      format.text { render :text => "Something texty" }
      format.html { render :text => "Something <i>texty</i>" }
    end
  end
end

新しいAction Mailerはthe new Mail gemにも構築されている。TMailの頭痛にさようならを言おう。

Bundlerによる依存管理

Railsアプリの依存関係を管理するのは継ぎ接ぎ仕事的面倒さを伴ってきた。config-gemやCapistrano、カスタマイズしたrake setup task、その他の不完全な解決方法だ。

Budlerはそれら全部を綺麗にしてくれて、あなたのアプリが依存しているライブラリ、フレームワーク、プラグインを指定できる。全てのRails3アプリは全てを管理するGemfileと一緒にセットアップできる。詳しくはBundlerのサイトを見て欲しい。

XSS保護をデフォルトに

インターネットは恐ろしいところだが、Rails3はあなたのためにデフォルトで注意してくれる。我々はフォーム経由のCRSF対策とSQLインジェクション対策を当初から備えていたが、Rails3ではXSS対策についても装備した。(Djangoでの対策方法が我々を納得させてくれた)

XSSについてのRailscastを見てRails3に触れて欲しいCross-site scriptingについてのビデオもある。

encodingの不具合にさよならを言おう

もしあなた頻繁にインターネットを見ているなら、多分 �的な文字を見かけることがあるだろう。この問題はとても蔓延していてその原因は異なる文字コードが混在することにある。

Railsのような仕組みではDB、テンプレート、その他のソース、あるいはユーザ由来のデータからコンテンツが成り立っている。Ruby1.9にはこれらの問題を考慮した素のツールが提供されているが、Rails3と組み合わせることで� 的文字は過去のものとなる。ユーザがMS Wordデータから張り付けた汚いデータによって悩まされることは二度と無くなる!

ActiveModel:全てのモデルでValidation、Callbackなどなどを利用可能に

我々はActiveRecordの良く使われる構成要素を新しいActiveRecordフレームワークに抽出した。これによってActiveRecordのvalidation、callback、serialize、i18nサポートをORMのMongoidのように使えるようになった。

加えてActionControllerを書き直したことでActive Recordを直接参照している箇所を取り除き、各種ORMから利用可能なきれいでシンプルなAPIを定義した。もしあなたがAPIに準拠したORM(DataMapper, Sequel, or Mongoidのような)を使えば、特に何か作業しなくてもORMのオブジェクトでform_for, link_to and redirect_toといった機能を使うことができる。

プラグイン向けの公開されたAPI

Active RecordやAction Mailerといった全てのRailsフレームワークが新しいプラグイン向けAPIを使えるという目標のため、我々はRailtiesも書き直した。これによってDataMapperやRSpecのようなRailsプラグインからもActive RecordやTest::Unitといった組み込みサポートと同じレヴェルで全ての内部実装へのアクセス手段を得たことになる。

新しいRailtieAPIは組み込みジェネレータの変更やrake taskの追加、Railsオプションのデフォルト値の設定、あるいは指定したコードを簡単に実行したり必要になるまで実行を遅らせたりすることが可能にする。DeviseのようなRailsプラグインはRails3でより良い実装を追加することが可能になった。数ヵ月後にはもっと多くの成果をお見せできるので期待して欲しい。

内部の書き換え

我々はAction PackとRailtiesの内部を書き直した。それらをより柔軟で拡張しやすくするためだ。一枚岩でできたActionController::Baseの代わりに、Rails3はAPIがきちんと定義されたモジュール群を提供する。それらはあなたが特別な利用目的に合わせて混ぜたり組み合わせて自分専用のコントローラを作るのに適している。Action MailerとCellプロジェクトもこの新機能に大いに使われている。

あなたは(昨年)Yehudaが投稿したブログ記事を読むことができる。新しいアーキテクチャでRackと ActionController::Metalを連携させてDjangoスタイルの通常のアクション類をいかに簡単に実装したかわかるだろう。

Railsのジェネレータの仕組みも刷新された。みんなが知っているRailsフレームワークの上に一枚岩で構成されたジェネレータのかわりに、それぞれのジェネレータは一連のhookを呼ぶ。hookには例えば:test_frameworkや:ormがあげられる。プラグインはそれらを取り扱うために登録できるようになっている。この仕組みによってrSpecや DataMapperやHamlを使ってるときにそれらのプラグインのためにカスタマイズしたscaffoldも生成できる。

jQuery,rSpec,DataMapperで”agnosticism”に到達

内部の書き直しと新しいプラグインAPIはRails3を構成するフレームワークの全構成要素に真の不可知論をもたらした。DataMapperの方がActive Recordより好き?問題ない。Prototypeの代わりにjQueryを使いたい?そうすればいい。test/unitの代わりにrSpecでテストしたい!ほらできた。

— ↓この文章よくわからないのでコメント欄でヘルプしてください!
It’s never been easier to Have It Your Way™ with Rails 3. And at the same time, we’ve made that happen without making using the excellent default stack any more complicated.

文書

Rails3は長期の開発サイクルを経ていいるので、みなさんがいくらか性急になってきた部分もあるかもしれない。その期間は書籍やチュートリアル筆者にとってはキャッチアップしたり用意をするチャンスを与えることにもなっている。順分な質のRails3の文書が既にあるが、すぐにもっと多くの書籍類が出てくると思う。

「The Agile Web Development with Rails 4th Ed book(アジャイル本第四版)」は既にほぼ用意ができているが、それ以外の非常にたくさんの書籍も出版予定になっている。全ての新しいガイドや公式ヴィデオ、Railscasts、チュートリアルをチェックして欲しい。詳しくは新しく更新された文書類の一覧を見て欲しい。

インストール方法

gem install rails --version 3.0.0.

ソースについてはRails v3.0.0のタグと、3-0-stableブランチがあるよ。

Rails3.0はRuby1.8.7、Ruby1.9.2、JRuby1.5.2以上で動くよう設計されている。

謝意と次のステップについて

私は個人的にもこのリリースを信じられないほど誇りに思う。私はRailsのために7年以上働いてきて、こんにち我々の手にあるRailsというフレームワークの質は正に目覚しいものと言える。これはコミュニティの努力だけでなく驚異的な開発者達による進歩(ウィンク)。全てのみなさん、どうもありがとう。

我々はRails3の開発及び修正作業に入っており、Rails3.1のstableブランチを微調整してすぐにmasterへ反映できると思う。