狠狠撸

狠狠撸Share a Scribd company logo
Crafting Rails4
Application
Chapter 3. Retrieving View Templates from Custom Stores
この章でなにするのか
? テンプレート管理システムを開発していきながらActionView::Render
の理解を深める。
? templateの保存先を?lesystemからdatabaseに切り替え、template
のCRUDを実装する
? resolverの実装?
railsでも実装されているresolverを実装することでtemplateがどの
ように解析されているのかを理解する。
? CmsControllerの開発?
applicationControllerの継承した上で汎用的なtemplateを返す
Controllerを開発する。
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など
? イメージだとこれ
以前実装した
MailForm::Noti?er
? view_pathを追加することで?
default views_pathからtemplateを探索?
=> lib/viewsを探索する。この順番でtemplate
を探す
? テンプレート管理システムを作るので
The Resolver API
? templateを返すメソッド?nd_all()?
cacheになければ、ブロックが返されるキャッ
シュメカニズム
ActionView::Resolver
? テンプレートを取り出すために
SqlTemplate::Resolverを作る
? イメージに加えるとこんな感じ
SqlTemplateTest
自作SqlTemplate::Resolver
? ?nd_all()はActionViewを返す。
? virtual_pathにテンプレートのpathを指定
? sourceはdatabaseに保存しているテンプレートボ
ディ
? テンプレートにはidを付与(ymlにidタグを追加)
? i18n.t( message )ではなく、users.index.message
sql_template.yml
? ymlをdatabaseとして活用している。
? idを付与
? UserのCRUDの追加
? /usersではlayoutのtemplate参照先が?le systemで?
bodyがdatabaseから参照される
Userが参照するtemplateを
?xtureに移動する。
? cacheは初期化の際に作成され、インスタンス変数
@cached
? Rails.application.con?g.cache_classes = trueの
ときにresolverはテンプレートを保存
? キャッシュのクリアはclear_cache()
? templateのvalues, cache, pre?x, name,localeで貯
蔵する。
productionにおけるtemplate
検索の速度
?nd_all()の引数によるcache
例
? 3つともに振る舞いは期待通りだけど、パフォー
マンスに違いがでる。
irbで軽くHashの操作
? undef_method :hashによりhashに保存するこ
とができない。
丑补蝉丑の操作イメージ
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
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}
!
Hash
? rubyでは、Object#hash()をキーとして蓄え
る。この整数値を利用して比較する。
3つのHashのパフォーマンス
テスト
ActionViewのcached()
? パフォーマンステストの結果によりHashの入れ
子がもっとも早いことがわかる。
? @cached[key][pre?x][name][partial][locals]?
=> 20倍の早さの差がでている。
cacheの破棄
? データが作成?更新されるときにclear_cache()
を呼び出す。
肠濒别补谤冲肠补肠丑别()の実装
肠濒别补谤冲肠补肠丑别()の実装2
? 保存した際に、instance.claer_cacheを実行す
る。
cacheの注意点
? resolver instanceがcacheをstoreしているの
で、databaseのtemplateを追加したり更新する
たびに全てのSqlTemplate::Resovler instance
とclear_cache()の実行を監視する必要がある。
? 対策
? redis, memcachedなどのKVSを利用する。
? キャッシュを破棄したい際にinstanceに通知を
出す。
? con?g.action_view.cache_template_loading
= falseにする
? con?g.action_view.cache_template_loading
= falseにする
? * テンプレートキャッシュが使用不可になる
が,templateのupdated_atとresolverがもつ日
時と比較して、resolverより新しければテンプ
レートを変換するようにしています。
ありがとうございまし
た。

More Related Content

発表资料20140318