Screencast: Einführung in Draper

Draper ist ein gem mit dem das Decorator Pattern auf domain-getriebene Modelle auf einfache Weise angewendet werden kann. Dabei werden die meisten Helfer in ein objekt-orientieren Ansatz umgewandelt, Filter auf dem Presentation-Layer ermöglicht und eine Schnittstelle zwischen den Controllern und Views zur Verfügung gestellt. Ryan zeigt in diesem Screencast wie es installiert, konfiguriert und benutzt wird.

 

Downloads in verschiedenen Formaten:

mp4
m4v
webm
ogg

 

Resourcen:

bash

[bash]
rails g draper:decorator user
[/bash]

Gemfile

[ruby]
gem ‚draper‘
[/ruby]

app/decorators/user_decorator.rb

[ruby]
class UserDecorator < ApplicationDecorator
decorates :user
allows :username

def avatar
site_link h.image_tag("avatars/#{avatar_name}", class: "avatar")
end

def linked_name
site_link(model.full_name.present? ? model.full_name : model.username)
end

def website
handle_none model.url do
h.link_to model.url, model.url
end
end

def twitter
handle_none model.twitter_name do
h.link_to model.twitter_name, "http://twitter.com/#{model.twitter_name}"
end
end

def bio
handle_none model.bio do
markdown(model.bio)
end
end

def member_since
model.created_at.strftime("%B %e, %Y")
end

private

def handle_none(value)
if value.present?
yield
else
h.content_tag :span, "None given", class: "none"
end
end

def site_link(content)
h.link_to_if model.url.present?, content, model.url
end

def avatar_name
if model.avatar_image_name.present?
model.avatar_image_name
else
"default.png"
end
end
end
[/ruby]

app/decorators/application_decorator.rb

[ruby]
class ApplicationDecorator < Draper::Base
def markdown(text)
Redcarpet.new(text, :hard_wrap, :filter_html, :autolink).to_html.html_safe
end
end
[/ruby]

app/controllers/users_controller.rb

[ruby]
def show
@user = UserDecorator.find(params[:id])
end
[/ruby]

users/show.html.erb

[html]
<div id="profile">
<%= @user.avatar %>
<h1><%= @user.linked_name %></h1>
<dl>
<dt>Username:</dt>
<dd><%= @user.username %></dd>
<dt>Member Since:</dt>
<dd><%= @user.member_since %></dd>
<dt>Website:</dt>
<dd><%= @user.website %></dd>
<dt>Twitter:</dt>
<dd><%= @user.twitter %></dd>
<dt>Bio:</dt>
<dd><%= @user.bio %></dd>
</dl>
</div>
[/html]

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.