Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
デコレータの
はなし
渋谷.rb[:20130918]
Takeshi Yabe / @tyabe
app/views/posts/show.slim
- if @post.image.present?
= image_tag @post.image.url
- else
= image_tag ‘default.png’
こんなのがどんどん...
models/post.rb
class Post < ActiveRecord::Base
def image_url
if self.image.present?
self.image.url
else
‘default.png’
end
...
models/post.rb
class Post < ActiveRecord::Base
def image_url
if self.image.present?
self.image.url
else
‘default.png’
end
...
Helper?
app/helpers/posts_helper.rb
StitchStitch::App.helpers do
# ...
end
・メソッド名の衝突を気にする必要がある
・OOPっぽくない
models/post.rb
class Post < ActiveRecord::Base
end
app/controllers/posts_controller.rb
SampleProject::App.controllers :pos...
spec/app/decorators/post_decorator_spec.rb
require 'spec_helper'
describe "PostDecorator" do
it 'can construct a new insta...
気軽に使いたいので
Generatorを作った
$ padrino g decorator
Usage:
padrino-gen decorator [name]
Options:
-r, [--root=ROOT] # The root destination
# Default: .
-...
$ tree
.
├── app
│ ├── app.rb
│ ├── controllers
│ ├── decorators
│ │   └── post_decorator.rb
│ ├── helpers
│ └── views
└──...
Rails
Draper も実現することは基本的には同じです
が、方式に違いがあります。ActiveDecorator は
モデルオブジェクトにモジュールを extend する
のに対し、Draper はモデルオブジェクトをラップ
するオブジェクトを作って...
Let's talk about it.
Padrino decorator
Padrino decorator
Padrino decorator
Padrino decorator
Padrino decorator
Padrino decorator
Padrino decorator
Padrino decorator
Upcoming SlideShare
Loading in …5
×

Padrino decorator

807 views

Published on

渋谷.rb[:20130918] での発表資料です

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Padrino decorator

  1. 1. デコレータの はなし 渋谷.rb[:20130918] Takeshi Yabe / @tyabe
  2. 2. app/views/posts/show.slim - if @post.image.present? = image_tag @post.image.url - else = image_tag ‘default.png’ こんなのがどんどんどんどん増えてくる view
  3. 3. models/post.rb class Post < ActiveRecord::Base def image_url if self.image.present? self.image.url else ‘default.png’ end end end app/views/posts/show.slim = image_tag @post.image_url model?
  4. 4. models/post.rb class Post < ActiveRecord::Base def image_url if self.image.present? self.image.url else ‘default.png’ end end end app/views/posts/show.slim = image_tag @post.image_url View用のメソッドが Modelに入っている キモい model?
  5. 5. Helper? app/helpers/posts_helper.rb StitchStitch::App.helpers do # ... end ・メソッド名の衝突を気にする必要がある ・OOPっぽくない
  6. 6. models/post.rb class Post < ActiveRecord::Base end app/controllers/posts_controller.rb SampleProject::App.controllers :posts do get :show, with: :id do post = Post.find(params[:id]) @post_decorator = PostDecorator.new(post) render ‘posts/show’ end end app/views/posts/show.slim - if @post_decorator.is_new_page? = image_tag @post_decorator.image app/decorators/posts_decorator.rb class PostDecorator attr_reader :post def initialize(post) @post = post end def image_url if self.image.present? self.image.url else ‘default.png’ end end end 表示用のロジックを Decorator に移す
  7. 7. spec/app/decorators/post_decorator_spec.rb require 'spec_helper' describe "PostDecorator" do it 'can construct a new instance' do post = create(:post) @post_decorator = PostDecorator.new(post, self) expect(@post_decorator.image_url).to eq ‘default.png’ end end テストも書きやすくなる
  8. 8. 気軽に使いたいので Generatorを作った
  9. 9. $ padrino g decorator Usage: padrino-gen decorator [name] Options: -r, [--root=ROOT] # The root destination # Default: . -a, [--app=APP] # The application destination path # Default: /app -d, [--destroy] -n, [--namespace=NAMESPACE] # The name space of your padrino project Description: padrino-gen decorator generates a new Padrino decorator つかいかた
  10. 10. $ tree . ├── app │ ├── app.rb │ ├── controllers │ ├── decorators │ │   └── post_decorator.rb │ ├── helpers │ └── views └── spec └── app └── decorators └── post_decorator_spec.rb Decorator用のファイルをつくります
  11. 11. Rails
  12. 12. Draper も実現することは基本的には同じです が、方式に違いがあります。ActiveDecorator は モデルオブジェクトにモジュールを extend する のに対し、Draper はモデルオブジェクトをラップ するオブジェクトを作ってメソッドを移譲しま す。 Draper の方式ではメソッドを追加する前とした 後でオブジェクトの identity が変化してしまうた め、よくよく注意しないとハマります。 引用:Rubyist Magazine - Ruby on Rails: The Bad Parts http://magazine.rubyist.net/?0041-RailsTheBadParts
  13. 13. Let's talk about it.

×