Skip to content

Commit b0ec5a5

Browse files
committed
Refactor using decorators and view context
1 parent 69e1b3b commit b0ec5a5

File tree

5 files changed

+85
-76
lines changed

5 files changed

+85
-76
lines changed

presenters/profiler/app/controllers/users_controller.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
class UsersController < ApplicationController
22
def show
3-
@user = current_user
3+
@user_decorator = UserDecorator.new(current_user, view_context)
44
end
55

66
private
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
class UserDecorator
2+
attr_reader :user, :view_context
3+
4+
def initialize(user, view_context)
5+
@user = user || User.new
6+
@view_context = view_context
7+
end
8+
9+
def image
10+
if user.image_url?
11+
view_context.image_tag user.image_url
12+
else
13+
view_context.image_tag "http://placehold.it/200x200"
14+
end
15+
end
16+
17+
def twitter_link
18+
if user.twitter?
19+
view_context.link_to "Twitter", user.twitter
20+
else
21+
view_context.link_to "Twitter", "http://twitter.com"
22+
end
23+
end
24+
25+
[:name, :email, :username, :website,
26+
:github, :twitter, :bio].each do |method_name|
27+
28+
define_method method_name do
29+
if user.send("#{method_name}?")
30+
user.send(method_name)
31+
else
32+
"No #{method_name} given"
33+
end
34+
end
35+
end
36+
37+
def method_missing(name, *args, &block)
38+
user.send(name, *args, &block)
39+
end
40+
41+
def respond_to_missing?(name, include_private = false)
42+
user.respond_to?(name, include_private) || super
43+
end
44+
end
Original file line numberDiff line numberDiff line change
@@ -1,82 +1,24 @@
1-
<% if @user %>
1+
<%= @user_decorator.image %>
22

3-
<% if @user.image_url? %>
4-
<%= image_tag @user.image_url %>
5-
<% else %>
6-
<%= image_tag "http://placehold.it/200x200" %>
7-
<% end %>
3+
<%= @user_decorator.twitter_link %>
84

9-
<h3>Name:</h3>
10-
<% if @user.name? %>
11-
<p><%= @user.name %></p>
12-
<% else %>
13-
<p>No name given</p>
14-
<% end %>
5+
<h3>Name:</h3>
6+
<p><%= @user_decorator.name %></p>
157

16-
<h3>Username:</h3>
17-
<% if @user.username? %>
18-
<p><%= @user.username%></p>
19-
<% else %>
20-
<p>No username given</p>
21-
<% end %>
8+
<h3>Username:</h3>
9+
<p><%= @user_decorator.username%></p>
2210

23-
<h3>Email:</h3>
24-
<% if @user.email? %>
25-
<p><%= @user.email %></p>
26-
<% else %>
27-
<p>No email given</p>
28-
<% end %>
11+
<h3>Email:</h3>
12+
<p><%= @user_decorator.email %></p>
2913

30-
<h3>Website:</h3>
31-
<% if @user.website? %>
32-
<p><%= @user.website %></p>
33-
<% else %>
34-
<p>No website given</p>
35-
<% end %>
14+
<h3>Website:</h3>
15+
<p><%= @user_decorator.website %></p>
3616

37-
<h3>Github:</h3>
38-
<% if @user.github? %>
39-
<p><%= @user.github %></p>
40-
<% else %>
41-
<p>No github given</p>
42-
<% end %>
17+
<h3>Github:</h3>
18+
<p><%= @user_decorator.github %></p>
4319

44-
<h3>Twitter:</h3>
45-
<% if @user.twitter? %>
46-
<p><%= @user.twitter %></p>
47-
<% else %>
48-
<p>No twitter given</p>
49-
<% end %>
20+
<h3>Twitter:</h3>
21+
<p><%= @user_decorator.twitter %></p>
5022

51-
<h3>Bio:</h3>
52-
<% if @user.bio? %>
53-
<p><%= @user.bio %></p>
54-
<% else %>
55-
<p>No bio given</p>
56-
<% end %>
57-
58-
<% else %>
59-
<%= image_tag "http://placehold.it/200x200" %>
60-
61-
<h3>Name:</h3>
62-
<p>No name given</p>
63-
64-
<h3>Username:</h3>
65-
<p>No username given</p>
66-
67-
<h3>Email:</h3>
68-
<p>No email given</p>
69-
70-
<h3>Website:</h3>
71-
<p>No website given</p>
72-
73-
<h3>Github:</h3>
74-
<p>No github given</p>
75-
76-
<h3>Twitter:</h3>
77-
<p>No twitter given</p>
78-
79-
<h3>Bio:</h3>
80-
<p>No bio given</p>
81-
82-
<% end %>
23+
<h3>Bio:</h3>
24+
<p><%= @user_decorator.bio %></p>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class AddDefaultsToUsers < ActiveRecord::Migration
2+
def self.up
3+
change_column_default :users, :image_url, "http://placehold.it/200x200"
4+
change_column_default :users, :name, "No name given"
5+
change_column_default :users, :username, "No username given"
6+
change_column_default :users, :email, "No email given"
7+
change_column_default :users, :website, "No website given"
8+
change_column_default :users, :github, "No github given"
9+
change_column_default :users, :twitter, "No twitter given"
10+
change_column_default :users, :bio, "No bio given"
11+
end
12+
13+
def self.down
14+
change_column_default :users, :image_url, nil
15+
change_column_default :users, :name, nil
16+
change_column_default :users, :username, nil
17+
change_column_default :users, :email, nil
18+
change_column_default :users, :website, nil
19+
change_column_default :users, :github, nil
20+
change_column_default :users, :twitter, nil
21+
change_column_default :users, :bio, nil
22+
end
23+
end

presenters/profiler/db/schema.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
#
1212
# It's strongly recommended that you check this file into your version control system.
1313

14-
ActiveRecord::Schema.define(version: 20150811234200) do
14+
ActiveRecord::Schema.define(version: 20150813005057) do
1515

1616
# These are extensions that must be enabled in order to support this database
1717
enable_extension "plpgsql"

0 commit comments

Comments
 (0)