Your SlideShare is downloading. ×

発表資料20140318

587

Published on

CHAPTER 3 Retrieving View Templates from Custom Stores

CHAPTER 3 Retrieving View Templates from Custom Stores

Published in: Engineering
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
587
On Slideshare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
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. Crafting Rails4 Application Chapter 3. Retrieving View Templates from Custom Stores
  • 2. この章でなにするのか • テンプレート管理システムを開発していきながらActionView::Render の理解を深める。 • templateの保存先をfilesystemからdatabaseに切り替え、template のCRUDを実装する • resolverの実装
 railsでも実装されているresolverを実装することでtemplateがどの ように解析されているのかを理解する。 • CmsControllerの開発
 applicationControllerの継承した上で汎用的なtemplateを返す Controllerを開発する。
  • 3. 3.1 Revisiting the Rendering Stack • まずは埋め込まれたrubyコードを実行可能にする。 • Rails controllerとviewで共有される lookup_contextにはtemplateを見つけるのに必要 な情報が含まれている。 • railsではデフォルトでview_pathを提供している。
 例: app/controllers/users#indexならば
 app/views/index.html.erbなど
  • 4. • イメージだとこれ
  • 5. 以前実装した MailForm::Notifier • view_pathを追加することで
 default views_pathからtemplateを探索
 => lib/viewsを探索する。この順番でtemplate を探す
  • 6. • テンプレート管理システムを作るので
  • 7. The Resolver API • templateを返すメソッドfind_all()
 cacheになければ、ブロックが返されるキャッ シュメカニズム
  • 8. ActionView::Resolver
  • 9. • テンプレートを取り出すために SqlTemplate::Resolverを作る • イメージに加えるとこんな感じ
  • 10. SqlTemplateTest
  • 11. 自作SqlTemplate::Resolver • find_all()はActionViewを返す。 • virtual_pathにテンプレートのpathを指定 • sourceはdatabaseに保存しているテンプレートボ ディ • テンプレートにはidを付与(ymlにidタグを追加) • i18n.t( message )ではなく、users.index.message
  • 12. sql_template.yml • ymlをdatabaseとして活用している。 • idを付与
  • 13. • UserのCRUDの追加 • /usersではlayoutのtemplate参照先がfile systemで
 bodyがdatabaseから参照される
  • 14. Userが参照するtemplateを fixtureに移動する。
  • 15. • cacheは初期化の際に作成され、インスタンス変数 @cached • Rails.application.config.cache_classes = trueの ときにresolverはテンプレートを保存 • キャッシュのクリアはclear_cache() • templateのvalues, cache, prefix, name,localeで貯 蔵する。 productionにおけるtemplate 検索の速度
  • 16. find_all()の引数によるcache 例 • 3つともに振る舞いは期待通りだけど、パフォー マンスに違いがでる。
  • 17. irbで軽くHashの操作 • undef_method :hashによりhashに保存するこ とができない。
  • 18. hashの操作イメージ
  • 19. Hashの実験1 • hash[:a] = 1
 => 1 • :a.hash
 => 1112200030795538893 • hash[:b] = 2
 => 2 • :b.hash
 => 2185038335961141261 • :a.eql?(:a)
 => true # valueが返される • :a.eql?(:b)
 => false # hash[:a]のvalueは返されない。
 => このままeql?を繰り返して見つからなければnil
  • 20. Hashの実験2 • hash = {} # Hash.newと同様 • object = Obejct.new
 => #<Object:0x007fb015155b90> • hash[object] = 1 • hash[object]
 => 1 • def object.hash; 123; end • hash[object]
 => nil • hash
 => {#<Object:0x007fb015155b90> => 1} !
  • 21. Hash • rubyでは、Object#hash()をキーとして蓄え る。この整数値を利用して比較する。
  • 22. 3つのHashのパフォーマンス テスト
  • 23. ActionViewのcached() • パフォーマンステストの結果によりHashの入れ 子がもっとも早いことがわかる。 • @cached[key][prefix][name][partial][locals]
 => 20倍の早さの差がでている。
  • 24. cacheの破棄 • データが作成・更新されるときにclear_cache() を呼び出す。
  • 25. clear_cache()の実装
  • 26. clear_cache()の実装2 • 保存した際に、instance.claer_cacheを実行す る。
  • 27. cacheの注意点 • resolver instanceがcacheをstoreしているの で、databaseのtemplateを追加したり更新する たびに全てのSqlTemplate::Resovler instance とclear_cache()の実行を監視する必要がある。
  • 28. • 対策 • redis, memcachedなどのKVSを利用する。 • キャッシュを破棄したい際にinstanceに通知を 出す。 • config.action_view.cache_template_loading = falseにする
  • 29. • config.action_view.cache_template_loading = falseにする • * テンプレートキャッシュが使用不可になる が,templateのupdated_atとresolverがもつ日 時と比較して、resolverより新しければテンプ レートを変換するようにしています。
  • 30. ありがとうございまし た。

×