Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

11,947 views

Published on

第1回渋谷Edge Rails勉強会

http://atnd.org/events/25273

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

  1. 1. Rails3.2ってどう変わるの?2012/03/06第1回渋谷Edge Rails勉強会大仲 能史 a.k.a. onk thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  2. 2. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC2 提供
  3. 3. 自己紹介 大仲 能史 @onk 仕事 ソーシャルゲーム事業本部 アプリケーションエンジニア 設計・開発担当 3 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  4. 4. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC4 本日のお題
  5. 5. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC5 う変わるの? Rails3.2ってど
  6. 6. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC6 を読もう! ⇒Release Note
  7. 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. 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. 9. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC9 だけ そうなところ 多いので面白
  10. 10. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC10 MAJOR FEATURES
  11. 11. Major Features 高速な development モードと routing 自動クエリExplain タグつきのログ 11 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  12. 12. Major Features 高速な development モードと routing ファイルが変更されたときのみclassを 再読み込みするようになりました journeyを使うことでroutingの認識が速 くなりました 12 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  13. 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. 14. Major Features 自動クエリExplain ActiveRecord::Relationにexplainメ ソッドが実装されました development mode では、0.5 秒以上か かったクエリは自動でEXPLAINも発行さ れ、ログに出力されるようになりまし た 14 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  15. 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. 16. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC16 変更点 以上が主な
  17. 17. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC17 の行きます 以下細かい
  18. 18. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC18 RAILTIES
  19. 19. Railties scaffoldやmodelのgeneratorの 属性のデフォルトをstringにし ました$ rails g model articleuser:references title body:text 19 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  20. 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. 21. Railties Rails::Rack::Logger middleware 更新。config.log_tagsに書いた 任意の tag を ActiveSupport::Taggedloggingに 渡すことができるようになりまし た subdomainやrequest idを表示すると便利! 21 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  22. 22. Railties 例外発生時にShowException middlewareから呼ばれる例外 処理アプリケーションを config.exceptions_appで設定 できるようになりました 22 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  23. 23. Railties 依存関係のあるファイルに変 更があったときのみclassを再 読み込みするようになり、 developmentの動作速度が向上 しました 23 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  24. 24. Railties Rails::Pluginは廃止予定になり、 Rails 4.0で削除される予定です 24 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  25. 25. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC25 ACTION MAILER
  26. 26. Action Mailer mailのバージョンを2.4.0に引 き上げました。 Rails 3.0で廃止予定になって いた古いAPIを削除しました 26 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  27. 27. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC27 ACTION PACK
  28. 28. Action Controller send_fileで:typeを指定しない 場合、拡張子からMIMEタイプ を自動で入れるようになりま した デフォルトで以下に対応 png jpg gif bmp tiff mpeg pdf zip 28 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  29. 29. Action Controller CSRFトークンが欠けている場 合に警告を出すログレベル を、:debugから:warnに変更し ました 29 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  30. 30. Action Controller APIリクエスト(:xml、:json)に 対してレスポンス本文が存在 しない場合、respounderは 204 No Content を返します。 scaffoldで作成したcontroller も同様に204を返すようになっ ています。 30 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  31. 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. 32. Action Controller ActionDispatch::ShowExcept ionsはリファクタされました。 例外表示/非表示の責務を controllerが負うことになりま す。 show_detailed_exceptions?をoverride することでエラー出力を切り替えます 32 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  33. 33. Action Dispatch ActionDispatch::RequestId ミドルウェアを追加しました。 一意なX-Request-Idヘッダがresponse に設定されるようになり、 ActionDispatch::Request#uuidから参 照できます。 TaggedLoggingで使うと便利? 33 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  34. 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. 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. 36. Action View :multipleなselect tagの前に、 hidden input tagを生成するよ うになりました 何も選択せずに送信した場合、 何も送られないというHTMLの 仕様への対策です 36 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  37. 37. Sprockets Assetsは相対プロトコルを 使っていましたが、デフォル トでリクエストと同じプロト コルを使うようになります。 37 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  38. 38. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC38 ACTIVE RECORD
  39. 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. 40. Active Record 1カラムでkey/value ストアを 表現する ActiveRecord::Base.storeを 実装しました 指定したカラムにserializeし たHashを入れることができま す。 40 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  41. 41. Active Record ユニークなクエリを生成する ActiveRecord::Relation#uniq を追加しましたUser.select("distinct name")User.select(:name).uniq 41 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  42. 42. Active Record 値の配列を返す ActiveRecord::Relation#pluc kメソッドが実装されました これはserializeされたattribute でも動作します 42 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  43. 43. Active RecordArticle.select(:id).map(&:id)Article.pluck(:id) 43 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  44. 44. Active Record ActiveRecord::Relation#exp lainが実装されました。 自動的にスロークエリを EXPLAINし、ログに吐くよう になりました。閾値はデフォ ルトで0.5秒です。 44 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  45. 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. 46. Active Record Engineからコピーされた migrationはEngine名のスコー プを持つようになりました 例えば以下のようなファイル名になり ます 01_create_posts.blog.rb 46 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  47. 47. Active Record scopeを指定してmigrationを 実行する機能を追加しました これにより、Engine単位で migrationを実行することがで きるようになりましたrake db:migrate SCOPE=blog 47 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  48. 48. Active Record transactionを開始する with_lockメソッドが追加され ました。 48 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  49. 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. 50. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC50 ACTIVE MODEL
  51. 51. Active Model ActiveModel::Errors#added? により定義されたエラーが発 生したかどうかチェックでき ます。 51 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  52. 52. Active Model mass_assignmentで保護された属性 を更新しようとしたときの振る舞い をmass_assignment_sanitizerで指定 できるようになりました。:logger と:strictがサポートされています。 :strictの場合、保護された属性を更新し ようとすると常に ActiveModel::MassAssignmentSecurity ::Errorをraiseします 52 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  53. 53. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC53 ACTIVE RESOURCE
  54. 54. Active Resource リダイレクトレスポンス: 303 See Other や 307 Temporary Redirect が返ってきた時も、 301 Moved Permanently や 302 Found が返ってきたとき と同様の挙動になりました。 54 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  55. 55. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC55 ACTIVE SUPPORT
  56. 56. Active Support ActiveSupport::TaggedLoggi ng を追加しました。これは任 意の標準 Logger クラスをラッ プし、タグ付け機能を付与す ることができます。 56 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  57. 57. Active Support Date、Time、DateTimeの beginning_of_weekメソッドは、 週の開始曜日を指定するオプ ションを付けられるようにな りました。 57 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  58. 58. Active Support ActiveSupport::Notificatio ns.subscribed を追加しまし た。与えたブロックが実行さ れている間のみの受信登録 (subscription) が可能です。 58 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  59. 59. Active Support Ruby 1.9におけるblank?の対 象がUnicodeホワイトスペース 文字([:space:])に拡張されま した。同様に、Ruby 1.8にお いては全角スペース(U+3000) が空白文字とみなされるよう になりました。 59 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  60. 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. 61. Active Support ActiveSupport::Cache::Null Store を、開発やテスト向け に追加しました。 61 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  62. 62. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC62 知っておくと面白い変更点
  63. 63. Railties Kindle用のRails Guide (.mobi) が同梱されるようになりまし た 63 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  64. 64. Railties d が destroy の alias に ~/.railsrcに rails new のオプ ションを保存できるように 64 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  65. 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. 66. Action View 日付のヘルパーメソッドに新 しいオプション :use_two_digit_numbers valueはそのまま、表示だけzero- paddingされます 66 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  67. 67. ActiveRecord development mode では、 db:create同様、 db:dropでtest データベースもdropされるよ うになりました。 67 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  68. 68. ActiveRecord アソシエーションのため の :class_nameオプションは string の代わりに symbol をと れるようになりました。 68 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  69. 69. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC69 お疲れさまでした 以上
  70. 70. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC70 自分でも見ておいてね だいぶ端折ったので
  71. 71. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC71 edgeの話 少しだけ
  72. 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. 73. Action Pack/Active Resource HTTP PATCHメソッドに対応 PUTは本来リソースの全置換え。 PATCHメソッドは差分を適用する。 差分更新がよりRESTな自然な形に 73 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  74. 74. Active Record ActiveRecord::Base を継承す るのを止めました ActiveRecord::Modelをincludeしてね AR=>DataMapperが楽になる?class Post include ActiveRecord::Modelend 74 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  75. 75. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC75 まとめ
  76. 76. まとめ Major Features ちょっ速 自動Explain TaggedLogging 76 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  77. 77. まとめ Railties 便利になった indexの定義漏れを防ぐgenerator syntax 77 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  78. 78. まとめ ActiveRecord 便利になった uniq, pluck, explain, with_lock store 意味的にしっかりしてきた migration の scope first_or_create 78 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  79. 79. まとめ ActiveSupport 便利になった TaggedLogging Time#all_day ActiveSupport::Cache::NullStore 79 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  80. 80. まとめ エラーの扱いが少し変わった CSRFトークンがなければ warning mass_assignment_sanitizer :strictplugin が非推奨になった 80 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  81. 81. まとめ 3.2での開発は捗るぞ 3.1からあまり変わっていない ちょっとずつ便利になってる毎日railsのcommit logを追いかけるの推奨4.0.0楽しみですね! 81 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  82. 82. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC82 ございました ご清聴ありがとう
  83. 83. ドリコムではCHANGELOGを読ドリコムでは を読むのが好きなエンジニアを募集しています 83 thgirypoC © .devreseR sthgiR llA dtL ,.oC MOCERD
  84. 84. .devreseR sthgiR llA dtL ,.oC MOCERD © thgirypoC84 U.where(has_question: true).present?

×