diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb
index 1828b78..f5c93a4 100644
--- a/app/controllers/sessions_controller.rb
+++ b/app/controllers/sessions_controller.rb
@@ -23,6 +23,8 @@ def create
omniauth_uid: auth['uid']
).first || User.create_with_omniauth(auth)
+ user.update!(email: auth['info']['email'])
+
session[:user_id] = user.id
return redirect_to params[:return_to] if params[:return_to].present?
end
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 497ff67..ee94012 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -1,5 +1,7 @@
# -*- encoding : utf-8 -*-
require 'kramdown'
+require 'digest/md5'
+require 'uri'
module ApplicationHelper
@@ -51,4 +53,25 @@ def markdown(md_body)
md_body
end
end
+
+ def gravatar_image(user, options = {})
+ return nil if user.nil? || user.email.nil?
+
+ hash = Digest::MD5.hexdigest(user.email.downcase)
+ query = options.select { |k, v| [:size, :default].include?(k) }
+ .map { |k, v| "#{k}=#{URI.encode(v.to_s)}" }
+ .join('&')
+ src = "//www.gravatar.com/avatar/#{hash}?#{query}"
+
+ img_options = { :alt => user.nickname }
+ if mouseover = options[:mouseover]
+ img_options = mouseover
+ end
+ if size = options[:size]
+ img_options[:width] = size
+ img_options[:height] = size
+ end
+
+ image_tag(src, img_options)
+ end
end
diff --git a/app/models/user.rb b/app/models/user.rb
index b56b58e..11cfbe6 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -11,6 +11,7 @@ def self.create_with_omniauth(auth)
create! do |user|
user.omniauth_provider = auth['provider']
user.omniauth_uid = auth['uid']
+ user.email = auth['info']['email']
user.nickname = nil
end
end
diff --git a/app/views/gists/_fork_of.html.erb b/app/views/gists/_fork_of.html.erb
index db2fb5c..4f33455 100644
--- a/app/views/gists/_fork_of.html.erb
+++ b/app/views/gists/_fork_of.html.erb
@@ -10,7 +10,9 @@
<%= time_ago_in_words(@gist.source_gist.created_at) + ' ago' %>
by
<% if @gist.source_gist.user.nil? %>Anonymous
- <% else %><%= link_to @gist.source_gist.user.nickname, user_path(@gist.source_gist.user) %>
+ <% else %>
+ <%= link_to @gist.source_gist.user.nickname, user_path(@gist.source_gist.user) %>
+ <%= gravatar_image(@gist.source_gist.user, :size => 15) %>
<% end %>
diff --git a/app/views/gists/_forks.html.erb b/app/views/gists/_forks.html.erb
index 213dac4..bbc786e 100644
--- a/app/views/gists/_forks.html.erb
+++ b/app/views/gists/_forks.html.erb
@@ -11,7 +11,9 @@
<%= time_ago_in_words(gist.created_at) + ' ago' %>
by
<% if gist.user.nil? %>Anonymous
- <% else %><%= link_to gist.user.nickname, user_path(gist.user) %>
+ <% else %>
+ <%= link_to gist.user.nickname, user_path(gist.user) %>
+ <%= gravatar_image(gist.user, :size => 15) %>
<% end %>
diff --git a/app/views/gists/_history.html.erb b/app/views/gists/_history.html.erb
index 4d4750b..64ca022 100644
--- a/app/views/gists/_history.html.erb
+++ b/app/views/gists/_history.html.erb
@@ -8,13 +8,17 @@
<%= time_ago_in_words(history.created_at) + ' ago' %>
by
<% if history.user.nil? %>Anonymous
- <% else %><%= link_to history.user.nickname, user_path(history.user) %>
+ <% else %>
+ <%= link_to history.user.nickname, user_path(history.user) %>
+ <%= gravatar_image(history.user, :size => 15) %>
<% end %>
<% else %>
<%= link_to time_ago_in_words(history.created_at) + ' ago', show_history_gist_path(@gist, history) %>
by
<% if history.user.nil? %>Anonymous
- <% else %><%= link_to history.user.nickname, user_path(history.user) %>
+ <% else %>
+ <%= link_to history.user.nickname, user_path(history.user) %>
+ <%= gravatar_image(history.user, :size => 15) %>
<% end %>
<% end %>
diff --git a/app/views/gists/_list.html.erb b/app/views/gists/_list.html.erb
index 5a630e9..b758859 100644
--- a/app/views/gists/_list.html.erb
+++ b/app/views/gists/_list.html.erb
@@ -20,6 +20,7 @@
Anonymous
<% else %>
<%= link_to gist.user.nickname, user_path(gist.user) %>
+ <%= gravatar_image(gist.user, :size => 20) %>
<% end %>
diff --git a/app/views/root/index.html.erb b/app/views/root/index.html.erb
index 2f04b05..4fbc595 100644
--- a/app/views/root/index.html.erb
+++ b/app/views/root/index.html.erb
@@ -22,7 +22,9 @@
<%= time_ago_in_words(gist.latest_history.created_at) + ' ago' %>
by
<% if gist.user.nil? %>Anonymous
- <% else %><%= link_to gist.user.nickname, user_path(gist.user) %>
+ <% else %>
+ <%= link_to gist.user.nickname, user_path(gist.user) %>
+ <%= gravatar_image(gist.user, :size => 20) %>
<% end %>
diff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erb
index a66ecac..d3bf513 100644
--- a/app/views/users/show.html.erb
+++ b/app/views/users/show.html.erb
@@ -2,7 +2,10 @@
<%= render :partial => 'common/flash_notice' %>
-
<%= @user.nickname %>
+
+ <%= gravatar_image(@user, :size => 30) %>
+ <%= @user.nickname %>
+
@@ -12,6 +15,9 @@
| <%= @user.omniauth_uid %> |
+
+ | <%= @user.email %> |
+
<% if @user.id == current_user.try(:id) %>
diff --git a/db/migrate/20140110041301_add_email_to_users.rb b/db/migrate/20140110041301_add_email_to_users.rb
new file mode 100644
index 0000000..1370f7d
--- /dev/null
+++ b/db/migrate/20140110041301_add_email_to_users.rb
@@ -0,0 +1,5 @@
+class AddEmailToUsers < ActiveRecord::Migration
+ def change
+ add_column :users, :email, :string
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 2c01257..8cd1add 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -11,36 +11,36 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema.define(version: 20121015023421) do
+ActiveRecord::Schema.define(version: 20140110041301) do
create_table "comments", force: true do |t|
t.integer "gist_id", null: false
t.integer "user_id", null: false
t.text "body", null: false
- t.datetime "created_at"
- t.datetime "updated_at"
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
end
create_table "favorites", force: true do |t|
t.integer "user_id", null: false
t.integer "gist_id", null: false
- t.datetime "created_at"
- t.datetime "updated_at"
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
end
create_table "gist_files", force: true do |t|
t.string "name", null: false
t.text "body", null: false
t.integer "gist_history_id", null: false
- t.datetime "created_at"
- t.datetime "updated_at"
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
end
create_table "gist_histories", force: true do |t|
t.integer "gist_id", null: false
t.integer "user_id"
- t.datetime "created_at"
- t.datetime "updated_at"
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
end
create_table "gists", force: true do |t|
@@ -48,16 +48,17 @@
t.boolean "is_public", null: false
t.integer "user_id"
t.integer "source_gist_id"
- t.datetime "created_at"
- t.datetime "updated_at"
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
end
create_table "users", force: true do |t|
t.string "nickname"
t.string "omniauth_provider", null: false
t.string "omniauth_uid", null: false
- t.datetime "created_at"
- t.datetime "updated_at"
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.string "email"
end
end
diff --git a/spec/controllers/sessions_controller_spec.rb b/spec/controllers/sessions_controller_spec.rb
index e99a341..51faf9b 100644
--- a/spec/controllers/sessions_controller_spec.rb
+++ b/spec/controllers/sessions_controller_spec.rb
@@ -25,18 +25,35 @@ def valid_session
describe "GET /auth/:provider/callback" do
it "accepts requests without header" do
- get :create, {:provider => 'open_id'}, valid_session
+ get :create, {:provider => 'open_id'}
expect(response.status).to eq(302)
expect(response).to redirect_to root_path
end
- it "accepts requests" do
- request.env['omniauth.auth'] = {
- "provider" => 'open_id',
- "uid" => "xxx"
- }
- get :create, {:provider => 'open_id', :return_to => '/foo'}, valid_session
- expect(response.status).to eq(302)
- expect(response).to redirect_to 'http://test.host/foo'
+ it "creates new user" do
+ expect {
+ request.env['omniauth.auth'] = {
+ 'provider' => 'open_id',
+ 'uid' => 'yyy',
+ 'info' => { 'email' => 'test@test.org' }
+ }
+ get :create, {:provider => 'open_id'}
+ }.to change { User.count }.from(0).to(1)
+ u = User.first
+ expect(u.omniauth_provider).to eq('open_id')
+ expect(u.omniauth_uid).to eq('yyy')
+ expect(u.email).to eq('test@test.org')
+ end
+ it "updates existing user" do
+ expect {
+ request.env['omniauth.auth'] = {
+ 'provider' => user.omniauth_provider,
+ 'uid' => user.omniauth_uid,
+ 'info' => { 'email' => 'test@test.org' }
+ }
+ get :create, {:provider => user.omniauth_provider}
+ }.not_to change { User.count }.from(1)
+ user.reload
+ expect(user.email).to eq('test@test.org')
end
end
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index f7611c5..f97abb4 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -8,14 +8,31 @@
expect(user).not_to be_nil
end
- it 'create with omniauth' do
+ it 'create with omniauth without email' do
auth = {
- "provider" => 'open_id',
- "uid" => 'xxxxxx'
+ 'provider' => 'open_id',
+ 'uid' => 'xxxxxx',
+ 'info' => {}
}
created = User.create_with_omniauth(auth)
expect(created.omniauth_provider).to eq('open_id')
expect(created.omniauth_uid).to eq('xxxxxx')
+ expect(created.email).to be_nil
+ expect(created.nickname).to be_nil
+ end
+
+ it 'create with omniauth with email' do
+ auth = {
+ 'provider' => 'open_id',
+ 'uid' => 'xxxxxx',
+ 'info' => {
+ 'email' => 'test@test.org'
+ }
+ }
+ created = User.create_with_omniauth(auth)
+ expect(created.omniauth_provider).to eq('open_id')
+ expect(created.omniauth_uid).to eq('xxxxxx')
+ expect(created.email).to eq('test@test.org')
expect(created.nickname).to be_nil
end
diff --git a/spec/requests/gists_spec.rb b/spec/requests/gists_spec.rb
index 2e0fd60..203e977 100644
--- a/spec/requests/gists_spec.rb
+++ b/spec/requests/gists_spec.rb
@@ -5,6 +5,9 @@
describe "GET /gists" do
it "works" do
+ 3.times do
+ create(:gist)
+ end
get gists_path
expect(response.status).to be(200)
end