狠狠撸
Submit Search
発表资料20140318
?
0 likes
?
1,355 views
Kazuyuki Ikeda
Follow
CHAPTER 3 Retrieving View Templates from Custom Stores
Read less
Read more
1 of 30
Download now
Download to read offline
More Related Content
発表资料20140318
1.
Crafting Rails4 Application Chapter 3.
Retrieving View Templates from Custom Stores
2.
この章でなにするのか ? テンプレート管理システムを開発していきながらActionView::Render の理解を深める。 ? templateの保存先を?lesystemから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::Noti?er ? view_pathを追加することで? default views_pathからtemplateを探索? =>
lib/viewsを探索する。この順番でtemplate を探す
6.
? テンプレート管理システムを作るので
7.
The Resolver API ?
templateを返すメソッド?nd_all()? cacheになければ、ブロックが返されるキャッ シュメカニズム
8.
ActionView::Resolver
9.
? テンプレートを取り出すために SqlTemplate::Resolverを作る ? イメージに加えるとこんな感じ
10.
SqlTemplateTest
11.
自作SqlTemplate::Resolver ? ?nd_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参照先が?le
systemで? bodyがdatabaseから参照される
14.
Userが参照するtemplateを ?xtureに移動する。
15.
? cacheは初期化の際に作成され、インスタンス変数 @cached ? Rails.application.con?g.cache_classes
= trueの ときにresolverはテンプレートを保存 ? キャッシュのクリアはclear_cache() ? templateのvalues, cache, pre?x, name,localeで貯 蔵する。 productionにおけるtemplate 検索の速度
16.
?nd_all()の引数によるcache 例 ? 3つともに振る舞いは期待通りだけど、パフォー マンスに違いがでる。
17.
irbで軽くHashの操作 ? undef_method :hashによりhashに保存するこ とができない。
18.
丑补蝉丑の操作イメージ
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][pre?x][name][partial][locals]? =>
20倍の早さの差がでている。
24.
cacheの破棄 ? データが作成?更新されるときにclear_cache() を呼び出す。
25.
肠濒别补谤冲肠补肠丑别()の実装
26.
肠濒别补谤冲肠补肠丑别()の実装2 ? 保存した際に、instance.claer_cacheを実行す る。
27.
cacheの注意点 ? resolver instanceがcacheをstoreしているの で、databaseのtemplateを追加したり更新する たびに全てのSqlTemplate::Resovler
instance とclear_cache()の実行を監視する必要がある。
28.
? 対策 ? redis,
memcachedなどのKVSを利用する。 ? キャッシュを破棄したい際にinstanceに通知を 出す。 ? con?g.action_view.cache_template_loading = falseにする
29.
? con?g.action_view.cache_template_loading = falseにする ?
* テンプレートキャッシュが使用不可になる が,templateのupdated_atとresolverがもつ日 時と比較して、resolverより新しければテンプ レートを変換するようにしています。
30.
ありがとうございまし た。
Download