SlideShare ist ein Scribd-Unternehmen logo
1 von 32
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などのエント
リポイントで任意の処理を追加することができ
るぞ

Weitere ähnliche Inhalte

Andere mochten auch

Railsチュートリアルの歩き方 (第4版)
Railsチュートリアルの歩き方 (第4版)Railsチュートリアルの歩き方 (第4版)
Railsチュートリアルの歩き方 (第4版)Yohei Yasukawa
 
Crafting Rails4 Applications読み回 7. Managing Application Events with Mountable...
Crafting Rails4 Applications読み回 7. Managing Application Events with Mountable...Crafting Rails4 Applications読み回 7. Managing Application Events with Mountable...
Crafting Rails4 Applications読み回 7. Managing Application Events with Mountable...Masato Mori
 
Building Modelsvwith Active Model
Building Modelsvwith Active ModelBuilding Modelsvwith Active Model
Building Modelsvwith Active ModelShozo Hatta
 
非エンジニアのためのこれだけは押さえておきたいWEBサービスの基礎技術
非エンジニアのためのこれだけは押さえておきたいWEBサービスの基礎技術非エンジニアのためのこれだけは押さえておきたいWEBサービスの基礎技術
非エンジニアのためのこれだけは押さえておきたいWEBサービスの基礎技術div Inc
 
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編infinite_loop
 
「スキルなし・実績なし」 32歳窓際エンジニアがシリコンバレーで働くようになるまで
「スキルなし・実績なし」 32歳窓際エンジニアがシリコンバレーで働くようになるまで「スキルなし・実績なし」 32歳窓際エンジニアがシリコンバレーで働くようになるまで
「スキルなし・実績なし」 32歳窓際エンジニアがシリコンバレーで働くようになるまでShuichi Tsutsumi
 
こわくない Git
こわくない Gitこわくない Git
こわくない GitKota Saito
 
人は1ヶ月でエンジニアになれるのか
人は1ヶ月でエンジニアになれるのか人は1ヶ月でエンジニアになれるのか
人は1ヶ月でエンジニアになれるのかYamaura Kiyoto
 
大規模Perl初心者研修を支える技術
大規模Perl初心者研修を支える技術大規模Perl初心者研修を支える技術
大規模Perl初心者研修を支える技術Daisuke Tamada
 
学生時代に知っておきたかったWeb技術の学び方の学び方 | リブセンス
学生時代に知っておきたかったWeb技術の学び方の学び方 | リブセンス学生時代に知っておきたかったWeb技術の学び方の学び方 | リブセンス
学生時代に知っておきたかったWeb技術の学び方の学び方 | リブセンスLivesense Inc.
 
人は一ヶ月でエンジニアになれるのか - 詳細解説
人は一ヶ月でエンジニアになれるのか - 詳細解説人は一ヶ月でエンジニアになれるのか - 詳細解説
人は一ヶ月でエンジニアになれるのか - 詳細解説Livesense Inc.
 

Andere mochten auch (12)

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

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

Rails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd editionRails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd editionGoh Matsumoto
 
Rails初心者レッスン lesson4 2edition
Rails初心者レッスン lesson4 2editionRails初心者レッスン lesson4 2edition
Rails初心者レッスン lesson4 2editionSatomi Tsujita
 
Dot netcore multiplatform 2
Dot netcore multiplatform 2Dot netcore multiplatform 2
Dot netcore multiplatform 2shozon
 
RubyとDSLと メタプログラミングと
RubyとDSLと メタプログラミングとRubyとDSLと メタプログラミングと
RubyとDSLと メタプログラミングとxiidec
 
Application Deployment on AWS
Application Deployment on AWSApplication Deployment on AWS
Application Deployment on AWSEiji Shinohara
 
Ruby on Rails 入門
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門Yasuko Ohba
 
Ruby で扱う LDAP のススメ
Ruby で扱う LDAP のススメRuby で扱う LDAP のススメ
Ruby で扱う LDAP のススメKazuaki Takase
 
スクリプト言語PHP攻略法
スクリプト言語PHP攻略法スクリプト言語PHP攻略法
スクリプト言語PHP攻略法Rui Hirokawa
 
A HUGE CHANGE RAILS 5 IS APPROACHING FAST
A HUGE CHANGE RAILS 5 IS APPROACHING FASTA HUGE CHANGE RAILS 5 IS APPROACHING FAST
A HUGE CHANGE RAILS 5 IS APPROACHING FASTKenichi Tachibana
 
Symfony2でより良いソフトウェアを作るために
Symfony2でより良いソフトウェアを作るためにSymfony2でより良いソフトウェアを作るために
Symfony2でより良いソフトウェアを作るためにAtsuhiro Kubo
 
初めてのPerl
初めてのPerl初めてのPerl
初めてのPerlarvelt s
 
Rails解説セミナー: リリースノート解説編
Rails解説セミナー: リリースノート解説編Rails解説セミナー: リリースノート解説編
Rails解説セミナー: リリースノート解説編Yohei Yasukawa
 
Railsの開発環境作るぞ
Railsの開発環境作るぞRailsの開発環境作るぞ
Railsの開発環境作るぞYoichi Toyota
 
Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!Daisuke Hiraoka
 
Google I/O 2013 報告会 Android Studio と Gradle
Google I/O 2013 報告会 Android Studio と GradleGoogle I/O 2013 報告会 Android Studio と Gradle
Google I/O 2013 報告会 Android Studio と GradleKeishin Yokomaku
 
Rails解説セミナー: Rails国際化 (I18n) API
Rails解説セミナー: Rails国際化 (I18n) APIRails解説セミナー: Rails国際化 (I18n) API
Rails解説セミナー: Rails国際化 (I18n) APIYohei Yasukawa
 
Rhodes mobile Framework (Japanese)
Rhodes mobile Framework (Japanese)Rhodes mobile Framework (Japanese)
Rhodes mobile Framework (Japanese)Yoshi Sakai
 
Play framework 2.0のちょっとした紹介
Play framework 2.0のちょっとした紹介Play framework 2.0のちょっとした紹介
Play framework 2.0のちょっとした紹介Ryo RKTM
 

Ähnlich wie Crafting Rails4 Applications読み回 1. Creating Our Own Renderer (20)

Rails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd editionRails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd edition
 
Rails初心者レッスン lesson4 2edition
Rails初心者レッスン lesson4 2editionRails初心者レッスン lesson4 2edition
Rails初心者レッスン lesson4 2edition
 
UnicastWS vol.2
UnicastWS vol.2UnicastWS vol.2
UnicastWS vol.2
 
Dot netcore multiplatform 2
Dot netcore multiplatform 2Dot netcore multiplatform 2
Dot netcore multiplatform 2
 
RubyとDSLと メタプログラミングと
RubyとDSLと メタプログラミングとRubyとDSLと メタプログラミングと
RubyとDSLと メタプログラミングと
 
Application Deployment on AWS
Application Deployment on AWSApplication Deployment on AWS
Application Deployment on AWS
 
Ruby on Rails 入門
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門
 
Ruby で扱う LDAP のススメ
Ruby で扱う LDAP のススメRuby で扱う LDAP のススメ
Ruby で扱う LDAP のススメ
 
スクリプト言語PHP攻略法
スクリプト言語PHP攻略法スクリプト言語PHP攻略法
スクリプト言語PHP攻略法
 
A HUGE CHANGE RAILS 5 IS APPROACHING FAST
A HUGE CHANGE RAILS 5 IS APPROACHING FASTA HUGE CHANGE RAILS 5 IS APPROACHING FAST
A HUGE CHANGE RAILS 5 IS APPROACHING FAST
 
Symfony2でより良いソフトウェアを作るために
Symfony2でより良いソフトウェアを作るためにSymfony2でより良いソフトウェアを作るために
Symfony2でより良いソフトウェアを作るために
 
初めてのPerl
初めてのPerl初めてのPerl
初めてのPerl
 
Rails解説セミナー: リリースノート解説編
Rails解説セミナー: リリースノート解説編Rails解説セミナー: リリースノート解説編
Rails解説セミナー: リリースノート解説編
 
Railsの開発環境作るぞ
Railsの開発環境作るぞRailsの開発環境作るぞ
Railsの開発環境作るぞ
 
Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!
 
Google I/O 2013 報告会 Android Studio と Gradle
Google I/O 2013 報告会 Android Studio と GradleGoogle I/O 2013 報告会 Android Studio と Gradle
Google I/O 2013 報告会 Android Studio と Gradle
 
Rails解説セミナー: Rails国際化 (I18n) API
Rails解説セミナー: Rails国際化 (I18n) APIRails解説セミナー: Rails国際化 (I18n) API
Rails解説セミナー: Rails国際化 (I18n) API
 
Rhodes mobile Framework (Japanese)
Rhodes mobile Framework (Japanese)Rhodes mobile Framework (Japanese)
Rhodes mobile Framework (Japanese)
 
Ppl
PplPpl
Ppl
 
Play framework 2.0のちょっとした紹介
Play framework 2.0のちょっとした紹介Play framework 2.0のちょっとした紹介
Play framework 2.0のちょっとした紹介
 

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