Ruby on Rails 4.0 勉強会資料

  • 13,406 views
Uploaded on

Rails4 社内勉強会の発表資料です。 …

Rails4 社内勉強会の発表資料です。

Blog: http://www.techscore.com/blog/2013/09/09/rails4-%E7%A4%BE%E5%86%85%E5%8B%89%E5%BC%B7%E4%BC%9A%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%88/

(2013/10/03) TECHSCORE 本体に Rails4 の記事を書きました!スライドでは書ききれなかった詳細についても解説していますので、そちらもご覧ください。see http://www.techscore.com/tech/Ruby/rails-4.0/

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
  • ありがとうございます。thin でためしてみましたが webrick のようにまとめてレスポンスが返ってくるのを確認しました!
    Are you sure you want to
    Your message goes here
  • @netwillnet コメントありがとうございます。

    Thin のバージョンごとの細かい違いは把握していないのですが、thin-1.5.1 では「Transfer-Encoding: chunked」に対応していないようでしたので NG としました。

    Linux をご利用であれば「wget -O- -d <URL>」や「curl -i <URL>」で少しずつレスポンスが返されるかどうかを確認する事ができます。(資料を作成したときにはそのように確認しました。)

    ActionController::Live を使用するときのポイントとしては、

    (1) アプリケーションサーバと Web サーバが Transfer-Encodinbg: chuncked に対応していること。

    が必須であり、

    (2) アプリケーションサーバが大量の同時接続数に耐えられること(≒マルチスレッド方式であること)

    が望ましいです。
    Are you sure you want to
    Your message goes here
  • ActionController::Live で使えるサーバの箇所、unicorn は 30 秒でコネクションが切れるからだめで、thin は大丈夫みたいな説明が下記ブログであったのですが現状はそのあたり変わったのでしょうか?

    http://tenderlovemaking.com/2012/07/30/is-it-live.html
    Are you sure you want to
    Your message goes here
  • P.26 の ConfirmationValidator の説明が逆になっていたので修正しました。
    Are you sure you want to
    Your message goes here
No Downloads

Views

Total Views
13,406
On Slideshare
0
From Embeds
0
Number of Embeds
12

Actions

Shares
Downloads
105
Comments
4
Likes
73

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. Rails4 SUZUKI, Kei
  • 2. Table of Contents 1. イントロダクション 2. 主な変更点 3. 注目機能 4. ライブラリの対応状況 5. はまりどころ 6. 残された課題 7. 参考情報 8. まとめ
  • 3. イントロダクション
  • 4. ハイライト ● Ruby2.0推奨、1.9.3以降をサポート ● Strong Parameters ● Turbolinks ● Russian Doll Caching イントロダクション
  • 5. 外部ライブラリ化された機能 ● 非推奨機能のため ○ Hash-based & Dynamic finder methods ● 使用頻度が低いなどの理由で ○ Mass assignment protection in Active Record models ○ ActiveRecord::SessionStore ○ Active Record Observers ○ Active Resource ○ Action Caching ○ Page Caching ○ Performance tests ● 疎結合にするため ○ Sprockets イントロダクション
  • 6. 主な変更点 全体的な変更
  • 7. プラグインの廃止 ● プラグイン(vendor/plugins)が廃止 ● バージョンや依存関係の管理に問題があった 主な変更点(全体的な変更) Rails2 vendor/plugins Rails3 bundler (vendor/plugins) Rails4 bundler ライブラリ管理がbundlerに一本化された
  • 8. テストコードのディレクトリ構成が変更 主な変更点(全体的な変更) Rails3 Rails4 unit functional integration performance fixtures models mailers helpers controllers integration fixtures テストコードの置き場所が明確になった
  • 9. concernsディレクトリの導入(1) ● concerns ディレクトリ ○ app/models/concerns ○ app/controllers/concerns ● 用途 ○ モデル、コントローラの Mixin 用モジュールを置く場所 ○ プロジェクトごとにバラバラだった置き場所を統一する 主な変更点(全体的な変更) 共通コードの置き場所が用意された
  • 10. concernsディレクトリの導入(2) ● 肥大化したクラスは機能ごとにモジュール分割 主な変更点(全体的な変更) # app/models/article.rb class Article < ActiveRecord::Base include Tagging include Rating end # app/models/concerns/tagging.rb module Tagging # … タグ付けに関するコード end # app/models/concerns/rating.rb module Rating # … レーティングに関するコード end # app/models/article.rb class Article < ActiveRecord::Base # … タグ付けに関するコード # … レーティングに関するコード # … その他のコード end 分割したモジュールの置き場所がconcerns
  • 11. index.html の動的生成 主な変更点(全体的な変更) public/index.htmlを消す手間が不要になった
  • 12. Not Found ページの改良 主な変更点(全体的な変更) ルーティングのインクリメンタル検索が可能になった
  • 13. 開発用情報ページの導入(1) 主な変更点(全体的な変更) ● /rails/info/routes ここでもインクリメンタル検索が可能
  • 14. 開発用情報ページの導入(2) 主な変更点(全体的な変更) ● /rails/info/properties Railsの起動を待たない分、rakeタスクより速い
  • 15. 内部的な変更 主な変更点(全体的な変更) ● デフォルトでスレッドセーフ ○ config.threadsafe! は廃止 ● ルーティングのパフォーマンス改善 ○ 内部エンジンがRack::MountからJourneyに変更 ● sprocketsのバージョンアップが容易になった ○ sprocketsと疎結合になったため ● ActiveSupport::Cache::MemCacheStore ○ 依存ライブラリがmemcache-clientからdalliに変更 ● ActiveSupport::Cache::Entry の最適化 ○ メモリ使用量と処理のオーバーヘッドを削減 目に見えない部分も改良されています
  • 16. 主な変更点 Model
  • 17. attr_accessible, attr_protected は非推奨 主な変更点(Model) ● protected_attributesとして外部ライブラリ化 ● 今後はStrongParametersを使用することを推奨 StrongParameters については後述します
  • 18. 動的なファインダメソッドは非推奨 主な変更点(Model) xxx_by_yyy は where(...) に置き換える find_all_by_XXX(...) → where(XXX: …) find_last_by_XXX(...) → where(XXX: …).last scoped_by_XXX(...) → where(XXX: …) find_or_initialize_by_XXX(...) → where(XXX: …).find_or_initialize find_or_create_by_XXX(...) → where(XXX: …).find_or_create または find_or_create_by(XXX: …) find_or_create_by_XXX!(...) → where(XXX: …).find_or_create! または find_or_create_by!(XXX: …)
  • 19. scope には Proc オブジェクトが必須 主な変更点(Model) Procを指定しない書き方(=バグの温床)は禁止 NG scope :recent, where(‘created_at > ?’, 7.days.ago) OK scope :recent, lambda { where(‘created_at > ?’, 7.days.ago) }
  • 20. ActiveModel::Modelモジュール(1) 主な変更点(Model) ● Rails3でモデルの機能がモジュール分割され、 再利用可能にはなったが・・ 再利用するだけで、これだけ書くの? class YourModel extend ActiveModel::Naming extend ActiveModel::Translation include ActiveModel::Validations include ActiveModel::Conversion def initialize(params={}) params.each do |attr, value| self.public_send(“#{attr}=”, value) end if params end def persisted? false end end
  • 21. ActiveModel::Modelモジュール(2) 主な変更点(Model) ● Rails4では基本的な機能を持つ ActiveModel::Modelモジュールが用意された includeするだけで簡単にモデルの機能を再利用可能 class YourModel include ActiveModel::Model end
  • 22. クエリ API の変更(1) 主な変更点(Model) ● all が配列ではなく Relation を返す ○ Rails3 では配列を返す ○ Rails4 では Relation を返す (配列が欲しい場合はto_aする) ● pluck は複数カラムを指定可能 ○ Rails3 では1つのカラムのみ指定可能 ● update_column の代わりに update_columns ○ update_column は非推奨 ● update_attributes は update のエイリアスに ○ update_attributes が非推奨となった訳ではない 細かい改良が多くあります
  • 23. クエリ API の変更(2) 主な変更点(Model) ● where.not で否定条件 ○ Rails3: where(‘name != ?’, ‘たろう’) ○ Rails4: where.not(name: ‘たろう’) ● 再代入せずに(破壊的に)条件を追加 ○ u = User.all ○ u.where!(name: ‘たろう’) ○ u.where!(status: ‘有効’) ○ u.order!(:created_at) ○ u.limit!(777) 細かい改良が多くあります
  • 24. クエリ API の変更(3) 主な変更点(Model) ● unscopeというexceptより柔軟なメソッドが追加 使用頻度は低いでしょう # except User.where(name: ‘Taro’, status: ‘OK’).except(:where) # unscope User.where(name: ‘Taro’, status: ‘OK’).unscope(where: :name)
  • 25. クエリ API の変更(4) 主な変更点(Model) ● 嫌な挙動が直った! ● Rails3だと ○ SELECT * FROM users WHERE name = ‘じろう’; ● Rails4だと ○ SELECT * FROM users WHERE name = ‘たろう’ AND name = ‘じろう’; scopeのチェインで問題になることが多くありました class User < ActiveRecord::Base scope :taro, lambda { where(name: ‘たろう’) } scope :jiro, lambda { where(name: ‘じろう’) } end User.taro.jiro.to_sql
  • 26. バリデーション 主な変更点(Model) ● validates_absence_of が追加された ○ blank? が true であることを検証する ● validates に :strict オプションが追加された ○ validates :xxx, …, strict: true ○ ActiveModel::StrictValidationFailed が raise される ● ConfirmationValidator のエラーメッセージ ○ Rails3: ATTR に設定される ○ Rails4: ATTR_confirmation に設定される ConfirmationValidatorの挙動変更は心の片隅に
  • 27. マイグレーション 主な変更点(Model) ● 条件付きでリバーシブルになったメソッド ○ drop_table, remove_column: 追加情報を与えれば ○ change_table: ブロック内で remove などをしなければ ● reversible メソッド ○ ブロック内で up/down を行うコードを指定可能 ● revert メソッド ○ 指定されたマイグレーションを down する あまり複雑なマイグレーションは書きたくないですね
  • 28. 主な変更点 View
  • 29. .jbuilderテンプレート 主な変更点(View) ● views/users/index.json.jbuilder scaffoldを使うとこのようなコードが生成されます json.array!(@users) do |user| json.extract! user, :name, :email, :birthday json.url user_url(user, format: :json) end
  • 30. .rubyテンプレート 主な変更点(View) ● views/users/index.html.ruby ● render :text => ‘ものすごく長い文字列’ ○ という場合は View に分割しましょう ポイントはControllerでViewの仕事をしすぎない ‘<p>Hello</p>’
  • 31. HTML5 用のヘルパーメソッド 主な変更点(View) ● week_field ● month_field ● datetime_field ● datetime_local_field ● color_field ● time_field ● date_field ● highlight ブラウザごとに対応しているタグは異なるので注意 week_field color_field
  • 32. 主な変更点 Controller
  • 33. フィルタのメソッド名が変更 主な変更点(Controller) xxx_filter から xxx_action に変更 before_action after_action around_action before_filter after_filter around_filter
  • 34. ルーティングの concern 主な変更点(Controller) 同じルーティングは concern にまとめる concern :confirmable do post :confirm end resources :users, concern: :confirmable resources :articles, concern: :confirmable resources :users do post :confirm end resources :articles do post :confirm end
  • 35. 主な変更点 ActiveSupport
  • 36. ● Inflection(単数形/複数形の変換)の国際化 ○ singularize, pluralize の引数にロケールを指定可能 ● Object#try, Object#try! ○ Object#try はメソッドがない場合に nil を返すように変更 ○ Object#try! は NoMethodError を raise する ActiveSupport 主な変更点(ActiveSupport) 他にも色々、細かい変更が多い
  • 37. 注目機能 Turbolinks
  • 38. Turbolinksとは 注目機能(Turbolinks) ● リンクのクリックをAjaxリクエストに変換 ○ レスポンスからページの <body> 内を置き換える ○ <title> など <head> 内の一部も書き換える ● <head> 内が変わらない場合に効果的 ○ CSS や Javascript の読み直しが発生しない ● Ajax って戻るボタンに弱い? ○ HTML5 の History API を利用し、戻るボタンにも対応 <head> 内がどのページでも同じ場合に有効
  • 39. 注意点 注目機能(Turbolinks) ● デフォルトで有効 ○ 使わない場合は明示的に無効化する必要がある ● Javascript イベントのタイミングが変わる ○ Javascript イベントのタイミングが変わる ○ 外部の Javascript ライブラリを使う場合も注意 使うときはポイントを押さえて!
  • 40. 注目機能 StrongParameters
  • 41. StrongParametersとは 注目機能(StrongParameters) ● モデルの一括代入問題の対策 ● 必要なリクエストパラメータだけ受け取る仕組み Rails4ではattr_accessibleではなくStrongParameters
  • 42. StrongParametersの使い方 注目機能(StrongParameters) scaffold が生成するコードを見ると分かりやすい class UsersController < AplicationController def create @user = User.new(user_params) … end def user_params params.require(:user).permit(:name, :email) end end
  • 43. attr_accessibleとの比較 注目機能(StrongParameters) ● attr_accessibleは モデルに一括代入可能な属性を制御する ● StrongParametersは リクエストとして受け取るパラメータを制御する 意図しない属性の書き換えを防ぎたい気持ちは同じ
  • 44. モデルの仕事、コントローラの仕事 注目機能(StrongParameters) attr_accessibleは問題を解決する場所を間違えていた ● モデルの仕事は自身の一貫性を保つこと ○ その画面では変更できない属性が何か、までは知らない ● コントローラの仕事は View とモデルの橋渡し ○ Viewからの入力をモデルに渡す ○ 表示すべきデータを View に渡す
  • 45. ● モデルの一括代入問題 ○ コントローラで解決すべき問題 ○ StrongParametersを使って解決する StrongParametersを使いましょう 注目機能(StrongParameters) 詳しい使い方は TECHSCORE BLOG へ
  • 46. 注目機能 ActionController::Live
  • 47. ActionController::Liveとは 注目機能(ActionController::Live) ● サーバ側からリアルタイムPush通知 ○ 別スレッドで少しずつレスポンスを返す ○ Transfer-Encoding: chunked ○ Server-Sent Events などが可能になる ● ストリーミングに対応したサーバが必要 ○ OK: Puma, Unicorn, Rainbows! ○ NG: WEBrick, Thin ● 大量コネクションに耐えるサーバが必要 ○ マルチプロセス(1プロセス1リクエスト)方式だと厳しい ○ マルチスレッド方式のほうが好ましい ○ Puma, Rainbows! などが候補 サーバ側からリアルタイムPush通知する機能
  • 48. コントローラの実装例 注目機能(ActionController::Live) class SampleController < ApplicationController include ActionController::Live def stream response.headers[‘Content-Type’] = ‘text/event-stream’ 10.times do |i| response.stream.write(“data: Hellonn”) sleep 1 end ensure response.stream.close end end
  • 49. レスポンスの確認 注目機能(ActionController::Live) $ curl -i http://localhost:3000/stream HTTP/1.1 200 OK X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1; mode=block X-Content-Type-Options: nosniff X-UA-Compatible: chrome=1 Content-Type: text/event-stream Cache-Control: no-cache Set-Cookie: request_method=GET; path=/ X-Request-Id: 6ef6eae2-e9d3-45ed-b993-5893cb75fbb3 X-Runtime: 0.024241 Transfer-Encoding: chunked event: message data: Hello 1 event: message data: Hello 2 event: message data: Hello 3 event: done data: done
  • 50. Viewの実装 注目機能(ActionController::Live) var eventSource = new EventSource(“/sample/stream”); eventSource.addEventListener(“message”, function(event) { // event.data に受信したメッセージが入っている alert(event.data); }); eventSource.addEventListener(“done”, function(event) { eventSource.close(); });
  • 51. 使いどころ 注目機能(ActionController::Live) ● リアルタイムPush通信と言えばチャットですが… ● 長時間かかるインポート処理の進捗 ● Twitter や Facebook のタイムライン ● Google Maps 上に表示する位置情報 アイディア次第で面白いことができるかも
  • 52. マルチスレッド対応
  • 53. マルチスレッド方式へ マルチスレッド対応 ● Webサーバ ○ Unicorn から Puma ● 非同期処理ライブラリ ○ Resque/Delayed_Job から Sidekiq マルチプロセス方式からマルチスレッド方式へ
  • 54. メリット、デメリット マルチスレッド対応 ● メリット ○ リソース効率向上 ○ パフォーマンス向上 ● デメリット ○ マルチスレッドを意識したコーディングが必要 マルチスレッド方式へ移行すべき?
  • 55. ライブラリの対応状況
  • 56. だいたい大丈夫 ライブラリの対応状況 ● 外部ライブラリ ○ [OK] unicorn 4.6.3 ○ [OK] thin 1.5.1 ○ [NG] mongrel 1.1.5 ○ [OK] bullet 4.6.0 ○ [OK] settingslogic 2.0.9 ○ [OK] rails_config 0.3.3 ○ [OK] rails4_acts_as_paranoid 0.1.4 ○ [OK] jpmobile 4.0.0 ○ [OK] device 1.5.4 ○ [OK] ssl_requirement 1.4.2 ○ [OK] kaminari 0.14.1 ○ [NG] meta_search 0.5.4 ○ [OK] paperclip ○ [OK] exception_notification 4.0.0 ○ [△] rails_admin 0.5.0 ○ [NG] typus 3.1.10 ○ [OK] dynamic_form 1.1.4 ● 社内ライブラリ ○ [OK] const_enum 1.0.4 (ActiveRecord 定数拡張) ○ [OK] easy_model 1.0.4 (DB 非依存モデルのサポート) ○ [OK] sys_logger 1.0.0 (Syslog モジュールのラッパー) ○ [OK] active_modurality 1.0.1 (モデルの継承機能支援) ○ [OK] activerecord-blockwhere 1.0.3 (Arel の where 拡張 DSL) 詳しくは TECHSCORE BLOG へ
  • 57. はまりどころ
  • 58. ● ActiveSupport::TaggedLogging ○ クラスからモジュールに変更された。 ● ルーティング定義の match ○ via オプションで HTTP メソッドの指定が必須になった。 ● abstract なモデルの scope ○ 正しく動かない問題がある。 はまりどころ はまりどころ 詳しくは TECHSCORE BLOG へ
  • 59. 残された課題
  • 60. 残された課題 残された課題 ● 導入が見送られた機能もある ○ Job Queue システム ○ 非同期処理 ● 見送られた理由 ○ 洗練されきっていない ○ 開発者間の合意が十分に取れなかった ○ etc... 今後に期待
  • 61. 参考情報
  • 62. 参考情報(1) 参考情報 ● [1] Ruby on Rails Guide (v4.0.0) ○ 最新版の Rails Guide です。 ● [2] Ruby on Rails 4.0 Release Notes ○ Rails4.0 のリリースノートです。 ○ 新機能や変更点の概要を知るには一番のページです。 ● [3] Upgrading from Rails 3.2 to Rails 4.0 ○ Rails4.0 へのアップグレードガイドです。 ○ 既存プロジェクトを Rails4.0 に移行する場合は必読です。 ● [4] GitHub (rails/rails 4-0-stable) ○ Rails4.0 のリポジトリです。 ○ ソースコードを確認する必要がある場合に参照しましょう。 ● [5] rails/actionmailer/CHANGELOG.md ○ actionmailer の CHANGELOG です。 ○ リリースノートには書かれていない詳細な変更点を知ることができます。 ● [6] rails/actionpack/CHANGELOG.md ○ actionpack の CHANGELOG です。 ○ リリースノートには書かれていない詳細な変更点を知ることができます。 ● [7] rails/activemodel/CHANGELOG.md ○ activemodel の CHANGELOG です。 ○ リリースノートには書かれていない詳細な変更点を知ることができます。 ● [8] rails/activerecord/CHANGELOG.md ○ activerecord の CHANGELOG です。 ○ リリースノートには書かれていない詳細な変更点を知ることができます。
  • 63. 参考情報(2) 参考情報 ● [9] rails/activesupport/CHANGELOG.md ○ activesupport の CHANGELOG です。 ○ リリースノートには書かれていない詳細な変更点を知ることができます。 ● [10] rails/railties/CHANGELOG.md ○ railties の CHANGELOG です。 ○ リリースノートには書かれていない詳細な変更点を知ることができます。 ● [11] Rails 4.0: Final version released! ○ Rails4.0 のリリースがアナウンスされた Blog エントリです。 ● [12] Rails 4.0: Release Candidate 2 released! ○ Rails4.0-rc2 のリリースがアナウンスされた Blog エントリです。 ● [13] Rails 4.0: Release Candidate 1 released! ○ Rails4.0-rc1 のリリースがアナウンスされた Blog エントリです。 ● [14] Ruby on Rails API ○ 最新版の API リファレンスです。 ● [15] Rails 4 Countdown to 2013 ○ Rails4.0 が開発中の頃から注目機能をまとめられているサイトです。 ○ 公式リリース後の内容に沿って注釈が丁寧に入れられています。 ● [16] EdgeRails.info ○ Rails の最新の開発状況のサマリーを毎週まとめているサイトです。 ● [17] WEB+DB PRESS vol.73 ○ Rails4.0 の分かりやすい特集が組まれています。 ● [18] Rails4 ライブラリ対応状況調査 ○ 主要ライブラリの Rails4 対応状況の調査結果をまとめています。
  • 64. 参考情報(3) 参考情報 ● [19] Rails4 の Strong Parameters でリクエストパラメータを検証する ○ Rails4.0 の注目機能の一つ、 Strong Parameters についてまとめています。 ● [20] Ruby on Rails 4.0 Release Notes を読む ○ Rails4.0 のリリースノートの内容をまとめています。 ● [21] Put chubby models on a diet with concerns ○ DHH によるconcerns の解説です。 ● [22] Edge Rails: PATCH is the new primary HTTP method for updates ○ リソースの更新を PUT ではなく PATCH で行うことに関するエントリです。
  • 65. まとめ
  • 66. まとめ まとめ ● Rails4 は既に使えるレベル ○ Rails4 で開発中の新規案件もあります。 ● Rails を使う以上、立ち止まってはいけない ○ Railsは「今」の「最善」を追及するフレームワーク ● 新機能は使えばいいってもんじゃない ○ Turbolinks を使う場合は慎重に ○ StrongParameters は積極的に使いましょう Enjoy Rails4 !!