Your SlideShare is downloading. ×
Rails3.2ってどう変わるの?
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

Rails3.2ってどう変わるの?

10,905
views

Published on

第1回渋谷Edge Rails勉強会 …

第1回渋谷Edge Rails勉強会

http://atnd.org/events/25273


1 Comment
29 Likes
Statistics
Notes
No Downloads
Views
Total Views
10,905
On Slideshare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
69
Comments
1
Likes
29
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Rails3.2ってどう変わるの?2012/03/06第1回渋谷Edge Rails勉強会大仲 能史 a.k.a. onk thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 2. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC2 提供
  • 3. 自己紹介 大仲 能史 @onk 仕事 ソーシャルゲーム事業本部 アプリケーションエンジニア 設計・開発担当 3 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 4. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC4 本日のお題
  • 5. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC5 う変わるの? Rails3.2ってど
  • 6. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC6 を読もう! ⇒Release Note
  • 7. Ruby on Rails 3.2 Release Notehttp://edgeguides.rubyonrails.org/3_2_release_notes.html 7 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 8. Ruby on Rails 3.2 Release Notehttp://developer.aiming-inc.com/rails/rails-3-2-release-note-in-ja/ (日本語訳) 8 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 9. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC9 だけ そうなところ 多いので面白
  • 10. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC10 MAJOR FEATURES
  • 11. Major Features 高速な development モードと routing 自動クエリExplain タグつきのログ 11 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 12. Major Features 高速な development モードと routing ファイルが変更されたときのみclassを 再読み込みするようになりました journeyを使うことでroutingの認識が速 くなりました 12 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 13. Major Features 高速な development モードと routing 超簡単なアプリでも400msほど違った ので、開発環境だけでも今すぐ上げる と幸せになれるよ# rails 3.2.2 + ruby 1.9.3Requests per second: 56.73 [#/sec] (mean)# rails 3.1.4 + ruby 1.9.3Requests per second: 18.19 [#/sec] (mean) 13 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 14. Major Features 自動クエリExplain ActiveRecord::Relationにexplainメ ソッドが実装されました development mode では、0.5 秒以上か かったクエリは自動でEXPLAINも発行さ れ、ログに出力されるようになりまし た 14 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 15. Major Features タグつきのログ ActiveSupport::TaggedLoggingが実装 されましたLogger = ActiveSupport::TaggedLogging.new(Logger.new(STDOUT))Logger.tagged("BCX") { Logger.info "Stuff" }# Logs "[BCX] Stuff"Logger.tagged("BCX", "Jason") { Logger.info "Stuff" }# Logs "[BCX] [Jason] Stuff"Logger.tagged("BCX") { Logger.tagged("Jason") { Logger.info"Stuff" } }# Logs "[BCX] [Jason] Stuff" 15 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 16. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC16 変更点 以上が主な
  • 17. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC17 の行きます 以下細かい
  • 18. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC18 RAILTIES
  • 19. Railties scaffoldやmodelのgeneratorの 属性のデフォルトをstringにし ました$ rails g model articleuser:references title body:text 19 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 20. Railties scaffold/model/migrationの generatorにindexおよびuniqと いう修飾子を与えられるよう になりましたrails g migration add_hoge_id_to_piyohoge_id:integer:uniqadd_column :piyos, :hoge_id, :integeradd_index :piyos, :hoge_id, :unique => true 20 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 21. Railties Rails::Rack::Logger middleware 更新。config.log_tagsに書いた 任意の tag を ActiveSupport::Taggedloggingに 渡すことができるようになりまし た subdomainやrequest idを表示すると便利! 21 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 22. Railties 例外発生時にShowException middlewareから呼ばれる例外 処理アプリケーションを config.exceptions_appで設定 できるようになりました 22 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 23. Railties 依存関係のあるファイルに変 更があったときのみclassを再 読み込みするようになり、 developmentの動作速度が向上 しました 23 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 24. Railties Rails::Pluginは廃止予定になり、 Rails 4.0で削除される予定です 24 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 25. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC25 ACTION MAILER
  • 26. Action Mailer mailのバージョンを2.4.0に引 き上げました。 Rails 3.0で廃止予定になって いた古いAPIを削除しました 26 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 27. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC27 ACTION PACK
  • 28. Action Controller send_fileで:typeを指定しない 場合、拡張子からMIMEタイプ を自動で入れるようになりま した デフォルトで以下に対応 png jpg gif bmp tiff mpeg pdf zip 28 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 29. Action Controller CSRFトークンが欠けている場 合に警告を出すログレベル を、:debugから:warnに変更し ました 29 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 30. Action Controller APIリクエスト(:xml、:json)に 対してレスポンス本文が存在 しない場合、respounderは 204 No Content を返します。 scaffoldで作成したcontroller も同様に204を返すようになっ ています。 30 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 31. Action Controller jQueryから叩くときに嬉しい # PUT /hoges/1 # PUT /hoges/1.json def update @hoge = Hoge.find(params[:id]) respond_to do |format| if @hoge.update_attributes(params[:hoge]) format.html { redirect_to @hoge, notice: Hoge was successfullyupdated. } format.json { head :no_content } else format.html { render action: "edit" } format.json { render json: @hoge.errors,status: :unprocessable_entity } end end end 31 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 32. Action Controller ActionDispatch::ShowExcept ionsはリファクタされました。 例外表示/非表示の責務を controllerが負うことになりま す。 show_detailed_exceptions?をoverride することでエラー出力を切り替えます 32 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 33. Action Dispatch ActionDispatch::RequestId ミドルウェアを追加しました。 一意なX-Request-Idヘッダがresponse に設定されるようになり、 ActionDispatch::Request#uuidから参 照できます。 TaggedLoggingで使うと便利? 33 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 34. Action View render :template => "foo.html.erb" のように、拡 張子の形で format や handler を渡す方式は廃止されました。 下記の形で利用してください。 render :template => “foo”, :formats => [:html, :js], :handlers => :erb 34 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 35. Action View formに名前空間を与えること ができるようになりました 今まで重複していたidを一意 なものにすることができます<%= form_for(@offer, :namespace => namespace) do |f| %> <%= f.label :version, Version %>: <%= f.text_field :version %><% end %> 35 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 36. Action View :multipleなselect tagの前に、 hidden input tagを生成するよ うになりました 何も選択せずに送信した場合、 何も送られないというHTMLの 仕様への対策です 36 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 37. Sprockets Assetsは相対プロトコルを 使っていましたが、デフォル トでリクエストと同じプロト コルを使うようになります。 37 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 38. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC38 ACTIVE RECORD
  • 39. Active Record first_or_create、 first_or_create!、 first_or_initializeをActive Recordに追加しました。 find_or_create_byよりもどの属性を 使って探す/作るのかが明確になるので 良いアプローチ 39 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 40. Active Record 1カラムでkey/value ストアを 表現する ActiveRecord::Base.storeを 実装しました 指定したカラムにserializeし たHashを入れることができま す。 40 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 41. Active Record ユニークなクエリを生成する ActiveRecord::Relation#uniq を追加しましたUser.select("distinct name")User.select(:name).uniq 41 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 42. Active Record 値の配列を返す ActiveRecord::Relation#pluc kメソッドが実装されました これはserializeされたattribute でも動作します 42 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 43. Active RecordArticle.select(:id).map(&:id)Article.pluck(:id) 43 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 44. Active Record ActiveRecord::Relation#exp lainが実装されました。 自動的にスロークエリを EXPLAINし、ログに吐くよう になりました。閾値はデフォ ルトで0.5秒です。 44 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 45. Active Record assosiation methodsをoverrideや compositionする際にsuperを使いやす いようmodule化しましたclass Car < ActiveRecord::Base belongs_to :owner belongs_to :old_owner def owner=(new_owner) self.old_owner = self.owner super endend 45 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 46. Active Record Engineからコピーされた migrationはEngine名のスコー プを持つようになりました 例えば以下のようなファイル名になり ます 01_create_posts.blog.rb 46 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 47. Active Record scopeを指定してmigrationを 実行する機能を追加しました これにより、Engine単位で migrationを実行することがで きるようになりましたrake db:migrate SCOPE=blog 47 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 48. Active Record transactionを開始する with_lockメソッドが追加され ました。 48 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 49. Active Recordclass Order < ActiveRecord::Base def cancel! transaction do lock! # ... cancelling logic end endendclass Order < ActiveRecord::Base def cancel! with_lock do # ... cancelling logic end endend 49 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 50. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC50 ACTIVE MODEL
  • 51. Active Model ActiveModel::Errors#added? により定義されたエラーが発 生したかどうかチェックでき ます。 51 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 52. Active Model mass_assignmentで保護された属性 を更新しようとしたときの振る舞い をmass_assignment_sanitizerで指定 できるようになりました。:logger と:strictがサポートされています。 :strictの場合、保護された属性を更新し ようとすると常に ActiveModel::MassAssignmentSecurity ::Errorをraiseします 52 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 53. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC53 ACTIVE RESOURCE
  • 54. Active Resource リダイレクトレスポンス: 303 See Other や 307 Temporary Redirect が返ってきた時も、 301 Moved Permanently や 302 Found が返ってきたとき と同様の挙動になりました。 54 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 55. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC55 ACTIVE SUPPORT
  • 56. Active Support ActiveSupport::TaggedLoggi ng を追加しました。これは任 意の標準 Logger クラスをラッ プし、タグ付け機能を付与す ることができます。 56 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 57. Active Support Date、Time、DateTimeの beginning_of_weekメソッドは、 週の開始曜日を指定するオプ ションを付けられるようにな りました。 57 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 58. Active Support ActiveSupport::Notificatio ns.subscribed を追加しまし た。与えたブロックが実行さ れている間のみの受信登録 (subscription) が可能です。 58 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 59. Active Support Ruby 1.9におけるblank?の対 象がUnicodeホワイトスペース 文字([:space:])に拡張されま した。同様に、Ruby 1.8にお いては全角スペース(U+3000) が空白文字とみなされるよう になりました。 59 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 60. Active Support 範囲を生成する方法として Time#all_day, Time#all_week, Time#all_quarter そして Time#all_year を追加しましTime.now.all_day た。# => 2012-03-06 00:00:00 +0900..2012-03-0623:59:59 +0900User.where(created_at: Time.now.all_day) 60 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 61. Active Support ActiveSupport::Cache::Null Store を、開発やテスト向け に追加しました。 61 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 62. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC62 知っておくと面白い変更点
  • 63. Railties Kindle用のRails Guide (.mobi) が同梱されるようになりまし た 63 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 64. Railties d が destroy の alias に ~/.railsrcに rails new のオプ ションを保存できるように 64 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 65. Railties rake routesの結果が見やす くなりました articles GET /articles(.:format) {:action=>"index", :controller=>"articles"} POST /articles(.:format) {:action=>"create", :controller=>"articles"} new_article GET /articles/new(.:format) {:action=>"new", :controller=>"articles"}edit_article GET /articles/:id/edit(.:format) {:action=>"edit", :controller=>"articles"} article GET /articles/:id(.:format) {:action=>"show", :controller=>"articles"} PUT /articles/:id(.:format) {:action=>"update", :controller=>"articles"} DELETE /articles/:id(.:format) {:action=>"destroy", :controller=>"articles"} articles GET /articles(.:format) articles#index POST /articles(.:format) articles#create new_article GET /articles/new(.:format) articles#newedit_article GET /articles/:id/edit(.:format) articles#edit article GET /articles/:id(.:format) articles#show PUT /articles/:id(.:format) articles#update DELETE /articles/:id(.:format) articles#destroy 65 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 66. Action View 日付のヘルパーメソッドに新 しいオプション :use_two_digit_numbers valueはそのまま、表示だけzero- paddingされます 66 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 67. ActiveRecord development mode では、 db:create同様、 db:dropでtest データベースもdropされるよ うになりました。 67 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 68. ActiveRecord アソシエーションのため の :class_nameオプションは string の代わりに symbol をと れるようになりました。 68 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 69. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC69 お疲れさまでした 以上
  • 70. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC70 自分でも見ておいてね だいぶ端折ったので
  • 71. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC71 edgeの話 少しだけ
  • 72. Railties console class を変更可能に# it can be added to config/application.rbconsole do require "pry" config.console = Pryend 72 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 73. Action Pack/Active Resource HTTP PATCHメソッドに対応 PUTは本来リソースの全置換え。 PATCHメソッドは差分を適用する。 差分更新がよりRESTな自然な形に 73 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 74. Active Record ActiveRecord::Base を継承す るのを止めました ActiveRecord::Modelをincludeしてね AR=>DataMapperが楽になる?class Post include ActiveRecord::Modelend 74 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 75. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC75 まとめ
  • 76. まとめ Major Features ちょっ速 自動Explain TaggedLogging 76 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 77. まとめ Railties 便利になった indexの定義漏れを防ぐgenerator syntax 77 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 78. まとめ ActiveRecord 便利になった uniq, pluck, explain, with_lock store 意味的にしっかりしてきた migration の scope first_or_create 78 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 79. まとめ ActiveSupport 便利になった TaggedLogging Time#all_day ActiveSupport::Cache::NullStore 79 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 80. まとめ エラーの扱いが少し変わった CSRFトークンがなければ warning mass_assignment_sanitizer :strictplugin が非推奨になった 80 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 81. まとめ 3.2での開発は捗るぞ 3.1からあまり変わっていない ちょっとずつ便利になってる毎日railsのcommit logを追いかけるの推奨4.0.0楽しみですね! 81 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 82. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC82 ございました ご清聴ありがとう
  • 83. ドリコムではCHANGELOGを読ドリコムでは を読むのが好きなエンジニアを募集しています 83 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  • 84. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC84 U.where(has_question: true).present?