SlideShare a Scribd company logo
Crafting Rails4 Applications
1. Creating Our Own Renderer
Renderer
• render()メソッドによりクライアントに返す形式
を柔軟に変更することができる
Post.allの結果をJSONに変換して返す
app/views/shared/not_authenticatedで始まる所定の
ファイル内容を返し,HTTPレスポンスコード401を返す
Creating Rails Plugins
rails plugin new pdf_renderer
• Rails pluginのgenerator
Treeで出したディレクトリツリー
ライブラリ本体
テスト用ディレクトリ
testディレクトリ以下の構造
dummy以下にあるのはどうみてもRailsアプリそのものです.本当にありがとうございました
${PLUGIN_NAME}.gemspec
• Gemのサマリ情報を書く
Rake tasks
• Plugin用のRakeタスクがちょいちょい
– Rake releaseでRubygemsにpushできるらしい
– testの実行はrake test
Dummy application
• 基本的に普通のRailsプロジェクトと同じ
– アプリケーション名はdummy
• rails new dummy でできるファイル群とほぼ同じ
– 一応diffしてみたけれども,確かにほとんど同じ
PDF Rendererを作る
actionpack/lib/action_controller/metal/renderers.rb
• とりあえず眺めてみると,
– ActionController::Renderers::_renderersにSetが入ってい
る
– _renderersはActionController::Renderers::add()で追加で
きる
• add(key, &block)の中では_render_option_#{key}を
define_methodしているだけ
– デフォルトで:json, :js, :xmlが定義されている
• 何気にJSONPのオプション(callback: true)も用意されていた
PDF Renderer作ろうぜ
• こういうのを作りたい
• rendererを拡張すれば,Railsの流儀に従ってい
い感じにPDF出力できるじゃん!!
Pluginにgemのdependency追加
• Pluginでgemを使う場合,Gemfileではなくgemspecに書く
– 書いた後は普通にbundleすればdependしたgemが入る
pdf_renderer.gemspec
• この辺の定義はGemfileにあった
Gemfile
この記述でgemspecのdependencyを読み込んでいるみたい
とりまPrawn
irb/pryでかきましょー
振る舞いとテストまで書いてみる
動作確認・開発の方法
• test/dummyにcdすれば,普通にrails sできる
– 普通のRailsアプリと同様に開発できるよー
lib/pdf_renderer.rb
この記述で:pdfをrender()が解釈できるようになる
MIME typeの設定
• テストを見ると,content-type: application/pdfが勝手に付与されて
いるが,これはたまたまPDFの設定がデフォルトであったから
Actionpack/lib/action_dispatch/http/mime_types.rb
• もしここに設定されていないcontent-typeを指定したい
場合,config/initializers/mime_types.rbに書けば良い
Rails newデフォルトのconfig/initializers/mime_types.rb
スマホ向けの出し分けなんかで触ったことある人もいるのでは?
Rendererを潜る
Render()の流れ
引数を展開して正規化されたoptions hashを作る
Renderのoptionが色々な形式に対応しているのはこの辺がやってる
render(:new)とか,render(partial: true)みたいなものを受けて,正しい
Action_nameに変換したりする
HTTP bodyに関係の無い部分をoptionsに沿って処理する.
status: 401とかそういうの
view_renderer.render(view_context, options)を呼び出す
view_contextはActionView::Baseのインスタンス
_render_template周り
• lookup_contextがformat情報を保持しているっぽい
– どのテンプレートが呼び出されるのかの選択に使われる
view_renderer
view_context
Controller -> Viewへの値渡しについて
• Rails 2.3系まで
– ViewがControllerのインスタンス変数を取りに行って
いた
• Rails 3.0から
– ControllerからViewに渡すインスタンス変数を明示的
に指定できるようになった
こうするとViewにインスタンス変数が渡らなくなる
拡張するぜ
AbstractController::Layouts
• Renderingの_normalize_optionsをoverrideし
た
・・・
もっと拡張
ActionController::Rendering
• DoubleRenderErrorのチェックとか,
status/content_type/location optionの処理
ActionController::Renderers
• 特定のsymbol渡しで特殊処理させるための
ひな形達
ActionController::Instrumentation
• 処理時間の計測
ActionController::Streaming
• HTTP/1.1 Chunkedを使ったRailsのStreaming API
render と render_to_string
• 違いは見ればわかるよね?
– pdf_rendererみたいにrenderした中身をstring取得したい時には便利
– render_to_stringは,DoubleRenderErrorは発生しない
(ActionController::Rendering#renderに実装されているため)
– 同じ理由でrender_to_stringはctionController::Instrumentationによっ
てベンチマークされない
話を戻すと
• render_to_string({})
– _normalize_options()でoptions =
template: ”#{controller_name}/#{action_name}”
を生成している
何もしなくても:template optionは使える
pdf_renderer.rb
おまけ:ActionController::Base
ApplicationController < ActionController::Baseで読み込まれるmodule群
まとめ
• PDFフォーマットのファイルを返す
pdf_rendererを作る中で,Railsのrendering
stackを追ってみたよ
• Rendering stackはモジュール化されているの
で,renderや_normalize_optionsなどのエント
リポイントで任意の処理を追加することができ
るぞ

More Related Content

PDF
ISUCON4 予選問題で(中略)、”my.cnf”に1行だけ足して予選通過ラインを突破するの術
PDF
Reactive Kafka with Akka Streams
PPTX
第7回 初心者向け Ruby on Rails勉強会 in 門前仲町
PPTX
同じサービスを ECSとOpsWorksで 運用してみた
KEY
Web Operations and Perl kansai.pm#14
KEY
恐るべきApache, Web勉強会@福岡
PDF
Ruby 3.0.0 コネタ集
PDF
Customize CakePHP bake
ISUCON4 予選問題で(中略)、”my.cnf”に1行だけ足して予選通過ラインを突破するの術
Reactive Kafka with Akka Streams
第7回 初心者向け Ruby on Rails勉強会 in 門前仲町
同じサービスを ECSとOpsWorksで 運用してみた
Web Operations and Perl kansai.pm#14
恐るべきApache, Web勉強会@福岡
Ruby 3.0.0 コネタ集
Customize CakePHP bake

Viewers also liked (9)

PDF
Railsチュートリアルの歩き方 (第4版)
PPTX
Crafting Rails4 Applications読み回 7. Managing Application Events with Mountable...
PPT
Building Modelsvwith Active Model
PDF
非エンジニアのためのこれだけは押さえておきたいWEBサービスの基礎技術
PDF
新入社員のための大規模ゲーム開発入門 サーバサイド編
PDF
「スキルなし・実績なし」 32歳窓際エンジニアがシリコンバレーで働くようになるまで
PDF
こわくない Git
PPT
大規模Perl初心者研修を支える技術
PDF
いつやるの?Git入門
Railsチュートリアルの歩き方 (第4版)
Crafting Rails4 Applications読み回 7. Managing Application Events with Mountable...
Building Modelsvwith Active Model
非エンジニアのためのこれだけは押さえておきたいWEBサービスの基礎技術
新入社員のための大規模ゲーム開発入門 サーバサイド編
「スキルなし・実績なし」 32歳窓際エンジニアがシリコンバレーで働くようになるまで
こわくない Git
大規模Perl初心者研修を支える技術
いつやるの?Git入門
Ad

Similar to Crafting Rails4 Applications読み回 1. Creating Our Own Renderer (16)

PDF
120529 railsとか勉強会v2
PPTX
Tech fun rails_workshop
PPTX
UnicastWS vol.2
PDF
Rails3.1rc4を試してみた
PDF
Comableを支える技術〜できるだけコーディングせずにズルして作るRailsアプリ〜
PDF
はじめての Rails アプリ開発
PDF
04 sending multipart_emails_using_template_handlers
PDF
20120702勉強会 webアプリ作ってみた
PDF
Ruby on Rails Tutorial
PDF
MF GeeksNight pplogの話
PPTX
フレームワーク品評会 Ruby on Rails #crossjp
PDF
増井雄一郎の「wri.pe」を事例に学ぶ、自作サービスの作り方〜開発編 先生:増井 雄一郎
PDF
Aiming study#6pdf
PDF
そのRails Engine、 本当に必要ですか?
PDF
初めての Raspberry pi 〜プラレールをunityの世界の中で走らせよう〜 (1)
PDF
RailsでReact.jsを動かしてみた話
120529 railsとか勉強会v2
Tech fun rails_workshop
UnicastWS vol.2
Rails3.1rc4を試してみた
Comableを支える技術〜できるだけコーディングせずにズルして作るRailsアプリ〜
はじめての Rails アプリ開発
04 sending multipart_emails_using_template_handlers
20120702勉強会 webアプリ作ってみた
Ruby on Rails Tutorial
MF GeeksNight pplogの話
フレームワーク品評会 Ruby on Rails #crossjp
増井雄一郎の「wri.pe」を事例に学ぶ、自作サービスの作り方〜開発編 先生:増井 雄一郎
Aiming study#6pdf
そのRails Engine、 本当に必要ですか?
初めての Raspberry pi 〜プラレールをunityの世界の中で走らせよう〜 (1)
RailsでReact.jsを動かしてみた話
Ad

Crafting Rails4 Applications読み回 1. Creating Our Own Renderer