diff --git a/app/controllers/api_controller.rb b/app/controllers/api_controller.rb
new file mode 100644
index 0000000..1e92bc7
--- /dev/null
+++ b/app/controllers/api_controller.rb
@@ -0,0 +1,3 @@
+class ApiController < ActionController::Base
+ #問題 如果沒有繼承action controller,會有什麼影響嗎?
+end
diff --git a/app/controllers/api_v1/messages_controller.rb b/app/controllers/api_v1/messages_controller.rb
new file mode 100644
index 0000000..0e609ca
--- /dev/null
+++ b/app/controllers/api_v1/messages_controller.rb
@@ -0,0 +1,10 @@
+class ApiV1::MessagesController < ApiController
+
+ def index
+ @messages = Message.all
+ end
+
+
+
+
+end
diff --git a/app/controllers/likes_controller.rb b/app/controllers/likes_controller.rb
new file mode 100644
index 0000000..150b6eb
--- /dev/null
+++ b/app/controllers/likes_controller.rb
@@ -0,0 +1,30 @@
+class LikesController < ApplicationController
+
+ before_action :authenticate_user!
+ before_action :set_message
+
+ def create
+ like = @message.finy_like_by(user)
+ if like
+ # do nothing
+ else
+ @message.likes.create!( :user => user )
+ end
+
+ redirect_to :back
+ end
+
+ def destroy
+ @like = user.likes.find( params[:id] )
+ @like.destroy
+
+ redirect_to :back
+ end
+
+ protected
+
+ def set_message
+ @message = message.find( params[:message_id] )
+ end
+
+end
diff --git a/app/controllers/messages_controller.rb b/app/controllers/messages_controller.rb
index 96f65e5..95a3360 100644
--- a/app/controllers/messages_controller.rb
+++ b/app/controllers/messages_controller.rb
@@ -31,7 +31,7 @@ def new
def create
@message = Message.new( message_params )
- @message.user = current_user
+ @message.user = user
@message.save!
@@ -39,13 +39,13 @@ def create
end
def edit
- @message = current_user.messages.find( params[:id] )
+ @message = user.messages.find( params[:id] )
render "new"
end
def update
- @message = current_user.messages.find( params[:id] )
+ @message = user.messages.find( params[:id] )
@message.update!( message_params )
@@ -53,12 +53,34 @@ def update
end
def destroy
- @message = current_user.messages.find( params[:id] )
+ @message = user.messages.find( params[:id] )
@message.destroy
redirect_to root_path
end
+ def subscribe
+ @message = message.find( params[:id] )
+
+ subscription = @message.finy_subscription_by(user)
+ if subscription
+ # do nothing
+ else
+ @subscription = @message.subscriptions.create!( :user => user )
+ end
+
+ redirect_to :back
+ end
+
+ def unsubscribe
+ @message = message.find( params[:id] )
+
+ subscription = @message.finy_subscription_by(user)
+ subscription.destroy
+
+ redirect_to :back
+ end
+
protected
def message_params
diff --git a/app/models/like.rb b/app/models/like.rb
new file mode 100644
index 0000000..3fd5eaf
--- /dev/null
+++ b/app/models/like.rb
@@ -0,0 +1,4 @@
+class Like < ActiveRecord::Base
+ belongs_to :topic
+ belongs_to :user
+end
diff --git a/app/models/message.rb b/app/models/message.rb
index e24a8b2..e1846bf 100644
--- a/app/models/message.rb
+++ b/app/models/message.rb
@@ -1,11 +1,17 @@
class Message < ActiveRecord::Base
belongs_to :user
-
has_many :comments, :dependent => :destroy
+ has_many :likes
+ has_many :likes_users, :through => :likes, :source => :user
+ has_many :subscriptions
+ has_many :subscribed_users, :through => :likes, :source => :user
def last_comment_summary
self.comments.last.try(:content).try(:truncate, 20)
end
+ def finy_subscription_by(user)
+ self.subscriptions.find_by_user_id( user.id )
+ end
end
diff --git a/app/models/subscription.rb b/app/models/subscription.rb
new file mode 100644
index 0000000..2da70f7
--- /dev/null
+++ b/app/models/subscription.rb
@@ -0,0 +1,6 @@
+class Subscription < ActiveRecord::Base
+
+ belongs_to :user
+ belongs_to :topic
+
+end
diff --git a/app/models/user.rb b/app/models/user.rb
index 6d01aa9..a696ef5 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -6,6 +6,10 @@ class User < ActiveRecord::Base
has_many :messages
has_many :comments
+ has_many :likes
+
+ has_many :subscriptions
+ has_many :subscribed_messages, :through => :likes, :source => :message
def display_name
self.email.split("@").first
diff --git a/app/models/user_message_ship.rb b/app/models/user_message_ship.rb
new file mode 100644
index 0000000..1da1520
--- /dev/null
+++ b/app/models/user_message_ship.rb
@@ -0,0 +1,3 @@
+class UserMessageShip < ActiveRecord::Base
+
+end
diff --git a/app/views/api_v1/messages/_message.json.jbuilder b/app/views/api_v1/messages/_message.json.jbuilder
new file mode 100644
index 0000000..77c960c
--- /dev/null
+++ b/app/views/api_v1/messages/_message.json.jbuilder
@@ -0,0 +1,8 @@
+json.message do
+ json.id message.id
+ json.status message.status
+ json.category_name message.category_name
+ json.title message.title
+ json.content message.content
+ json.created_at message.created_at
+end
diff --git a/app/views/api_v1/messages/index.json.jbuilder b/app/views/api_v1/messages/index.json.jbuilder
new file mode 100644
index 0000000..2ad5d68
--- /dev/null
+++ b/app/views/api_v1/messages/index.json.jbuilder
@@ -0,0 +1,5 @@
+json.results do
+ json.array!(@messages) do |m|
+ json.partial! 'message', message: m
+ end
+end
diff --git a/app/views/messages/show.html.erb b/app/views/messages/show.html.erb
index 41401f6..ca5e126 100644
--- a/app/views/messages/show.html.erb
+++ b/app/views/messages/show.html.erb
@@ -2,6 +2,22 @@
<%= simple_format @message.content %>
+
+
subscription list
+
+<% @message.subscriptions.each do |u| %>
+- <%= u.user.email %>
+<% end %>
+
+
+
+like list
+
+<% @message.likes.each do |u| %>
+- <%= u.user.email %>
+<% end %>
+
+
Comments list
<%= form_for [@message, @comment] do |f| %>
@@ -28,4 +44,3 @@
<% end %>
-
diff --git a/config/routes.rb b/config/routes.rb
index 74d4dbf..e2b00ff 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -5,6 +5,13 @@
resources :comments
end
+ scope :path => '/api/v1/', :module => "api_v1", :as => 'v1', :defaults => { :format => :json } do
+ resources :messages
+ end
+
+
+
+
# 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/20160429091408_create_subscriptions.rb b/db/migrate/20160429091408_create_subscriptions.rb
new file mode 100644
index 0000000..d5b6c6f
--- /dev/null
+++ b/db/migrate/20160429091408_create_subscriptions.rb
@@ -0,0 +1,9 @@
+class CreateSubscriptions < ActiveRecord::Migration
+ def change
+ create_table :subscriptions do |t|
+ t.integer :user_id, :integer, :index => true
+ t.integer :message_id, :integer, :index => true
+ t.timestamps null: false
+ end
+ end
+end
diff --git a/db/migrate/20160429091414_create_likes.rb b/db/migrate/20160429091414_create_likes.rb
new file mode 100644
index 0000000..405be91
--- /dev/null
+++ b/db/migrate/20160429091414_create_likes.rb
@@ -0,0 +1,9 @@
+class CreateLikes < ActiveRecord::Migration
+ def change
+ create_table :likes do |t|
+ t.integer :user_id, :integer, :index => true
+ t.integer :message_id, :integer, :index => true
+ t.timestamps null: false
+ end
+ end
+end
diff --git a/db/migrate/20160429091553_create_user_message_ships.rb b/db/migrate/20160429091553_create_user_message_ships.rb
new file mode 100644
index 0000000..48c6f5e
--- /dev/null
+++ b/db/migrate/20160429091553_create_user_message_ships.rb
@@ -0,0 +1,9 @@
+class CreateUserMessageShips < ActiveRecord::Migration
+ def change
+ create_table :user_message_ships do |t|
+ t.integer :user_id, :integer, :index => true
+ t.integer :message_id, :integer, :index => true
+ t.timestamps null: false
+ end
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index ef7b5c0..16d62c9 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: 20150728165437) do
+ActiveRecord::Schema.define(version: 20160429091553) do
create_table "comments", force: :cascade do |t|
t.text "content"
@@ -23,6 +23,17 @@
add_index "comments", ["message_id"], name: "index_comments_on_message_id"
+ create_table "likes", force: :cascade do |t|
+ t.integer "user_id"
+ t.integer "integer"
+ t.integer "message_id"
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ end
+
+ add_index "likes", ["message_id"], name: "index_likes_on_message_id"
+ add_index "likes", ["user_id"], name: "index_likes_on_user_id"
+
create_table "messages", force: :cascade do |t|
t.string "title"
t.text "content"
@@ -36,6 +47,28 @@
add_index "messages", ["status"], name: "index_messages_on_status"
add_index "messages", ["user_id"], name: "index_messages_on_user_id"
+ create_table "subscriptions", force: :cascade do |t|
+ t.integer "user_id"
+ t.integer "integer"
+ t.integer "message_id"
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ end
+
+ add_index "subscriptions", ["message_id"], name: "index_subscriptions_on_message_id"
+ add_index "subscriptions", ["user_id"], name: "index_subscriptions_on_user_id"
+
+ create_table "user_message_ships", force: :cascade do |t|
+ t.integer "user_id"
+ t.integer "integer"
+ t.integer "message_id"
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ end
+
+ add_index "user_message_ships", ["message_id"], name: "index_user_message_ships_on_message_id"
+ add_index "user_message_ships", ["user_id"], name: "index_user_message_ships_on_user_id"
+
create_table "users", force: :cascade do |t|
t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false
diff --git a/lib/tasks/dev.rake b/lib/tasks/dev.rake
index 4673e72..752ecbb 100644
--- a/lib/tasks/dev.rake
+++ b/lib/tasks/dev.rake
@@ -16,7 +16,13 @@ namespace :dev do
:status => ["pending", "completed"].sample,
:content => Faker::Lorem.paragraph,
:user => users.sample,
- :created_at => Time.now - rand(30).days )
+ :created_at => Time.now - rand(30).days
+ )
+ 2.times do
+ m.likes.create!(:user => users.sample)
+ m.subscriptions.create!(:user => users.sample)
+ end
+
5.times do
m.comments.create!( :content => Faker::Lorem.paragraph,
:user => users.sample )
@@ -24,4 +30,4 @@ namespace :dev do
end
end
-end
\ No newline at end of file
+end
diff --git a/spec/models/like_spec.rb b/spec/models/like_spec.rb
new file mode 100644
index 0000000..76ea93d
--- /dev/null
+++ b/spec/models/like_spec.rb
@@ -0,0 +1,5 @@
+require 'rails_helper'
+
+RSpec.describe Like, type: :model do
+ pending "add some examples to (or delete) #{__FILE__}"
+end
diff --git a/spec/models/subscription_spec.rb b/spec/models/subscription_spec.rb
new file mode 100644
index 0000000..d40bf0b
--- /dev/null
+++ b/spec/models/subscription_spec.rb
@@ -0,0 +1,5 @@
+require 'rails_helper'
+
+RSpec.describe Subscription, type: :model do
+ pending "add some examples to (or delete) #{__FILE__}"
+end
diff --git a/spec/models/user_message_ship_spec.rb b/spec/models/user_message_ship_spec.rb
new file mode 100644
index 0000000..8f7b550
--- /dev/null
+++ b/spec/models/user_message_ship_spec.rb
@@ -0,0 +1,5 @@
+require 'rails_helper'
+
+RSpec.describe UserMessageShip, type: :model do
+ pending "add some examples to (or delete) #{__FILE__}"
+end