diff --git a/Gemfile b/Gemfile
index 2e94b22..1e90bfa 100644
--- a/Gemfile
+++ b/Gemfile
@@ -37,6 +37,10 @@ group :production do
gem 'rails_12factor'
end
+group :development do
+ gem 'nifty-generators'
+end
+
# Bootstrap
gem 'bootstrap-sass', '2.3.2.0'
@@ -58,3 +62,5 @@ gem 'faker', '1.1.2'
# Use debugger
# gem 'debugger', group: [:development, :test]
+
+gem "mocha", group: :test
\ No newline at end of file
diff --git a/Gemfile.lock b/Gemfile.lock
index c1f7878..4c7f499 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -56,9 +56,13 @@ GEM
mail (2.5.4)
mime-types (~> 1.16)
treetop (~> 1.4.8)
+ metaclass (0.0.2)
mime-types (1.25.1)
minitest (4.7.5)
+ mocha (1.0.0)
+ metaclass (~> 0.0.1)
multi_json (1.8.4)
+ nifty-generators (0.4.6)
pg (0.17.1)
polyglot (0.3.3)
rack (1.5.2)
@@ -128,6 +132,8 @@ DEPENDENCIES
faker (= 1.1.2)
jbuilder (~> 1.2)
jquery-rails
+ mocha
+ nifty-generators
pg
rails (= 4.0.2)
rails_12factor
diff --git a/app/controllers/synapses_controller.rb b/app/controllers/synapses_controller.rb
new file mode 100644
index 0000000..f757d9c
--- /dev/null
+++ b/app/controllers/synapses_controller.rb
@@ -0,0 +1,17 @@
+class SynapsesController < ApplicationController
+ def create
+ @synapse = current_user.synapses.build(:other_user_id => params[:other_user_id])
+ if @synapse.save
+ redirect_to root_url, :notice => "Successfully added!"
+ else
+ flash[:error] = "Sorry, something went wrong. We're working on it."
+ redirect_to root_url
+ end
+ end
+
+ def destroy
+ @synapse = current_user.synapses.find(params[:id])
+ @synapse.destroy
+ redirect_to current_user, :notice => "Removed connection."
+ end
+end
diff --git a/app/helpers/synapses_helper.rb b/app/helpers/synapses_helper.rb
new file mode 100644
index 0000000..58508a3
--- /dev/null
+++ b/app/helpers/synapses_helper.rb
@@ -0,0 +1,2 @@
+module SynapsesHelper
+end
diff --git a/app/models/synapse.rb b/app/models/synapse.rb
new file mode 100644
index 0000000..c9f0c39
--- /dev/null
+++ b/app/models/synapse.rb
@@ -0,0 +1,4 @@
+class Synapse < ActiveRecord::Base
+ belongs_to :user
+ belongs_to :other_user, :class_name => "User"
+end
diff --git a/app/models/user.rb b/app/models/user.rb
index a755e66..a2494cc 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -1,6 +1,11 @@
class User < ActiveRecord::Base
has_many :posts, dependent: :destroy
+ has_many :synapses
+ has_many :other_users, :through => :synapses
+ has_many :inverse_synapses, :class_name => "Synapse", :foreign_key => "other_user_id"
+ has_many :inverse_other_users, :through => :inverse_synapses, :source => :user
+
before_save { self.email = email.downcase }
before_create :create_remember_token
diff --git a/app/views/users/index.html.erb b/app/views/users/index.html.erb
index 2062069..e68a783 100644
--- a/app/views/users/index.html.erb
+++ b/app/views/users/index.html.erb
@@ -2,5 +2,10 @@
All users
- <%= render @users %>
+<% for user in User.all %>
+ -
+ <%= user.name %>
+ (<%= link_to "add", synapses_path(:other_user_id => user), :method => :post %>)
+
+<% end %>
\ No newline at end of file
diff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erb
index cb515ec..725a2a3 100644
--- a/app/views/users/show.html.erb
+++ b/app/views/users/show.html.erb
@@ -4,6 +4,22 @@
+
+ Connections
+
+ <% for synapse in @user.synapses %>
+ -
+ <%= synapse.other_user.name %>
+ (<%= link_to "remove", synapse, method: :delete %>)
+
+ <% end %>
+ <% for user in @user.inverse_other_users %>
+ -
+ <%= user.name %>
+
+ <% end %>
+
+
<% if @user.posts.any? %>
diff --git a/config/routes.rb b/config/routes.rb
index c1183ee..2d4cac7 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -12,6 +12,8 @@
resources :posts, only: [:create, :destroy]
+ resources :synapses
+
# The priority is based upon order of creation: first created -> highest priority.
# See how all your routes lay out with "rake routes".
diff --git a/db/migrate/20140127184714_create_synapses.rb b/db/migrate/20140127184714_create_synapses.rb
new file mode 100644
index 0000000..6a0264c
--- /dev/null
+++ b/db/migrate/20140127184714_create_synapses.rb
@@ -0,0 +1,13 @@
+class CreateSynapses < ActiveRecord::Migration
+ def self.up
+ create_table :synapses do |t|
+ t.integer :user_id
+ t.integer :other_user_id
+ t.timestamps
+ end
+ end
+
+ def self.down
+ drop_table :synapses
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index dcc5418..52bba6e 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -11,7 +11,7 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema.define(version: 20140122232133) do
+ActiveRecord::Schema.define(version: 20140127184714) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@@ -27,6 +27,24 @@
add_index "posts", ["user_id", "created_at"], name: "index_posts_on_user_id_and_created_at", using: :btree
+ create_table "relationships", force: true do |t|
+ t.integer "follower_id"
+ t.integer "followed_id"
+ t.datetime "created_at"
+ t.datetime "updated_at"
+ end
+
+ add_index "relationships", ["followed_id"], name: "index_relationships_on_followed_id", using: :btree
+ add_index "relationships", ["follower_id", "followed_id"], name: "index_relationships_on_follower_id_and_followed_id", unique: true, using: :btree
+ add_index "relationships", ["follower_id"], name: "index_relationships_on_follower_id", using: :btree
+
+ create_table "synapses", force: true do |t|
+ t.integer "user_id"
+ t.integer "other_user_id"
+ t.datetime "created_at"
+ t.datetime "updated_at"
+ end
+
create_table "users", force: true do |t|
t.string "email"
t.string "name"
diff --git a/test/fixtures/synapses.yml b/test/fixtures/synapses.yml
new file mode 100644
index 0000000..43af7cd
--- /dev/null
+++ b/test/fixtures/synapses.yml
@@ -0,0 +1,7 @@
+one:
+ user_id:
+ other_user_id:
+
+two:
+ user_id:
+ other_user_id:
diff --git a/test/functional/synapses_controller_test.rb b/test/functional/synapses_controller_test.rb
new file mode 100644
index 0000000..fd080fb
--- /dev/null
+++ b/test/functional/synapses_controller_test.rb
@@ -0,0 +1,22 @@
+require 'test_helper'
+
+class SynapsesControllerTest < ActionController::TestCase
+ def test_create_invalid
+ Synapse.any_instance.stubs(:valid?).returns(false)
+ post :create
+ assert_template 'new'
+ end
+
+ def test_create_valid
+ Synapse.any_instance.stubs(:valid?).returns(true)
+ post :create
+ assert_redirected_to root_url
+ end
+
+ def test_destroy
+ synapse = Synapse.first
+ delete :destroy, :id => synapse
+ assert_redirected_to root_url
+ assert !Synapse.exists?(synapse.id)
+ end
+end
diff --git a/test/unit/synapse_test.rb b/test/unit/synapse_test.rb
new file mode 100644
index 0000000..9ab7eeb
--- /dev/null
+++ b/test/unit/synapse_test.rb
@@ -0,0 +1,7 @@
+require 'test_helper'
+
+class SynapseTest < ActiveSupport::TestCase
+ def test_should_be_valid
+ assert Synapse.new.valid?
+ end
+end