From 23002a0301425144f503e949628442395e2262d7 Mon Sep 17 00:00:00 2001
From: Owen Ou
Date: Fri, 22 Jul 2016 16:02:07 +0800
Subject: [PATCH 1/6] add ajax delete comment
---
app/controllers/comments_controller.rb | 2 +-
app/views/messages/_comment.html.erb | 5 +++++
app/views/messages/comment_block.js.erb | 2 ++
app/views/messages/show.html.erb | 18 ++++++++++--------
4 files changed, 18 insertions(+), 9 deletions(-)
create mode 100644 app/views/messages/_comment.html.erb
create mode 100644 app/views/messages/comment_block.js.erb
diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb
index e9d6aaa..a8feaf6 100644
--- a/app/controllers/comments_controller.rb
+++ b/app/controllers/comments_controller.rb
@@ -16,7 +16,7 @@ def destroy
@comment = current_user.comments.find( params[:id] )
@comment.destroy
- redirect_to :back
+ render "messages/show"
end
protected
diff --git a/app/views/messages/_comment.html.erb b/app/views/messages/_comment.html.erb
new file mode 100644
index 0000000..df56d76
--- /dev/null
+++ b/app/views/messages/_comment.html.erb
@@ -0,0 +1,5 @@
+
+
+ <%= simple_format comment.content %> at <%= comment.created_at.to_s(:short) %> by <%= comment.user.display_name %>
+
+
diff --git a/app/views/messages/comment_block.js.erb b/app/views/messages/comment_block.js.erb
new file mode 100644
index 0000000..4ff30d7
--- /dev/null
+++ b/app/views/messages/comment_block.js.erb
@@ -0,0 +1,2 @@
+
+$("#comment-block").html("<%=j render :partial => "messages/comment" %>");
\ No newline at end of file
diff --git a/app/views/messages/show.html.erb b/app/views/messages/show.html.erb
index 41401f6..f9582cb 100644
--- a/app/views/messages/show.html.erb
+++ b/app/views/messages/show.html.erb
@@ -18,14 +18,16 @@
<% end %>
<% @message.comments.each do |comment| %>
-
- <%= simple_format comment.content %> at <%= comment.created_at.to_s(:short) %> by <%= comment.user.display_name %>
-
- <% if comment.user == current_user %>
+
+
+
+ <% if comment.user == current_user %>
<%# TODO: 修改成 AJAX 版本的刪除 %>
- <%= link_to "Delete", message_comment_path(@message, comment), :method => :delete, :data => { :confirm => "Are u sure?"} %>
- <% end %>
-
+ <%= link_to "Delete", message_comment_path(@message, comment), :method => :delete, :data => { :confirm => "Are u sure?"} %>
+ <% end %>
<% end %>
-
+
+
\ No newline at end of file
From d8061538eb64525e92a4cbb7c19f607c32914abd Mon Sep 17 00:00:00 2001
From: Owen Ou
Date: Fri, 22 Jul 2016 17:37:23 +0800
Subject: [PATCH 2/6] fix ajax & n+1 query
---
app/controllers/comments_controller.rb | 6 +++++-
app/controllers/messages_controller.rb | 4 ++--
app/views/messages/_comment.html.erb | 5 -----
app/views/messages/comment_block.js.erb | 3 ++-
app/views/messages/show.html.erb | 17 ++++++++++-------
5 files changed, 19 insertions(+), 16 deletions(-)
delete mode 100644 app/views/messages/_comment.html.erb
diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb
index a8feaf6..81f01f4 100644
--- a/app/controllers/comments_controller.rb
+++ b/app/controllers/comments_controller.rb
@@ -15,8 +15,12 @@ def create
def destroy
@comment = current_user.comments.find( params[:id] )
@comment.destroy
+ respond_to do |format|
+ format.html { redirect_to :back }
+ format.js { render "/messages/comment_block"}
+ end
- render "messages/show"
+
end
protected
diff --git a/app/controllers/messages_controller.rb b/app/controllers/messages_controller.rb
index 96f65e5..864693c 100644
--- a/app/controllers/messages_controller.rb
+++ b/app/controllers/messages_controller.rb
@@ -3,8 +3,8 @@ class MessagesController < ApplicationController
before_action :authenticate_user!, :except => [:index, :show]
def index
- # TODO: fix N+1 queries for user and comments
- @messages = Message.order("id DESC").page( params[:page] )
+ # TODO: fix N+1 queries for user and comments done
+ @messages = Message.order("id DESC").includes(:user, :comments).page( params[:page] )
if params[:status] == "pending"
# TODO: @messages = @messages.pending
diff --git a/app/views/messages/_comment.html.erb b/app/views/messages/_comment.html.erb
deleted file mode 100644
index df56d76..0000000
--- a/app/views/messages/_comment.html.erb
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
- <%= simple_format comment.content %> at <%= comment.created_at.to_s(:short) %> by <%= comment.user.display_name %>
-
-
diff --git a/app/views/messages/comment_block.js.erb b/app/views/messages/comment_block.js.erb
index 4ff30d7..170b1fd 100644
--- a/app/views/messages/comment_block.js.erb
+++ b/app/views/messages/comment_block.js.erb
@@ -1,2 +1,3 @@
-$("#comment-block").html("<%=j render :partial => "messages/comment" %>");
\ No newline at end of file
+$("#comment-block-<%= @comment.id %>").remove();
+
diff --git a/app/views/messages/show.html.erb b/app/views/messages/show.html.erb
index f9582cb..4c13ee1 100644
--- a/app/views/messages/show.html.erb
+++ b/app/views/messages/show.html.erb
@@ -19,14 +19,17 @@
<% @message.comments.each do |comment| %>
-
+
<% end %>
From 2b872e83c7fb8fa77df78261136005e1eeee4b2d Mon Sep 17 00:00:00 2001
From: Owen Ou
Date: Fri, 22 Jul 2016 17:42:28 +0800
Subject: [PATCH 3/6] add scope
---
app/controllers/messages_controller.rb | 6 +++---
app/models/message.rb | 4 ++++
2 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/app/controllers/messages_controller.rb b/app/controllers/messages_controller.rb
index 864693c..d026a84 100644
--- a/app/controllers/messages_controller.rb
+++ b/app/controllers/messages_controller.rb
@@ -8,15 +8,15 @@ def index
if params[:status] == "pending"
# TODO: @messages = @messages.pending
- @messages = @messages.where( :status => "pending" )
+ @messages = @messages.pending
elsif params[:status] == "completed"
# TODO: @messages = @messages.completed
- @messages = @messages.where( :status => "completed" )
+ @messages = @messages.completed
end
if params[:days]
# TODO: @messages = @messages.within_days(params[:days].to_i)
- @messages = @messages.where( ["created_at >= ?", Time.now - params[:days].to_i.days ] )
+ @messages = @messages.within_days(params[:days].to_i)
end
end
diff --git a/app/models/message.rb b/app/models/message.rb
index e24a8b2..39397f2 100644
--- a/app/models/message.rb
+++ b/app/models/message.rb
@@ -4,6 +4,10 @@ class Message < ActiveRecord::Base
has_many :comments, :dependent => :destroy
+ scope :pending, -> { where status: "pending" }
+ scope :completed, -> {where status: "completed" }
+ scope :within_days, -> (time){ where "created_at >= ?", Time.now - time.days }
+
def last_comment_summary
self.comments.last.try(:content).try(:truncate, 20)
end
From 0fde0cc15631670d2b4e2bba4a36f4c56fce01ca Mon Sep 17 00:00:00 2001
From: Owen Ou
Date: Fri, 22 Jul 2016 18:03:56 +0800
Subject: [PATCH 4/6] api
---
app/assets/javascripts/api_controller.coffee | 3 +++
app/assets/javascripts/api_v1/messages.coffee | 3 +++
app/assets/stylesheets/api_controller.scss | 3 +++
app/assets/stylesheets/api_v1/messages.scss | 3 +++
app/controllers/api_controller_controller.rb | 2 ++
app/controllers/api_v1/messages_controller.rb | 7 +++++++
app/helpers/api_controller_helper.rb | 2 ++
app/helpers/api_v1/messages_helper.rb | 2 ++
app/views/api_v1/messages/index.json.jbuilder | 4 ++++
config/routes.rb | 7 +++++++
.../controllers/api_controller_controller_spec.rb | 5 +++++
.../api_v1/messages_controller_spec.rb | 5 +++++
spec/helpers/api_controller_helper_spec.rb | 15 +++++++++++++++
spec/helpers/api_v1/messages_helper_spec.rb | 15 +++++++++++++++
14 files changed, 76 insertions(+)
create mode 100644 app/assets/javascripts/api_controller.coffee
create mode 100644 app/assets/javascripts/api_v1/messages.coffee
create mode 100644 app/assets/stylesheets/api_controller.scss
create mode 100644 app/assets/stylesheets/api_v1/messages.scss
create mode 100644 app/controllers/api_controller_controller.rb
create mode 100644 app/controllers/api_v1/messages_controller.rb
create mode 100644 app/helpers/api_controller_helper.rb
create mode 100644 app/helpers/api_v1/messages_helper.rb
create mode 100644 app/views/api_v1/messages/index.json.jbuilder
create mode 100644 spec/controllers/api_controller_controller_spec.rb
create mode 100644 spec/controllers/api_v1/messages_controller_spec.rb
create mode 100644 spec/helpers/api_controller_helper_spec.rb
create mode 100644 spec/helpers/api_v1/messages_helper_spec.rb
diff --git a/app/assets/javascripts/api_controller.coffee b/app/assets/javascripts/api_controller.coffee
new file mode 100644
index 0000000..24f83d1
--- /dev/null
+++ b/app/assets/javascripts/api_controller.coffee
@@ -0,0 +1,3 @@
+# Place all the behaviors and hooks related to the matching controller here.
+# All this logic will automatically be available in application.js.
+# You can use CoffeeScript in this file: http://coffeescript.org/
diff --git a/app/assets/javascripts/api_v1/messages.coffee b/app/assets/javascripts/api_v1/messages.coffee
new file mode 100644
index 0000000..24f83d1
--- /dev/null
+++ b/app/assets/javascripts/api_v1/messages.coffee
@@ -0,0 +1,3 @@
+# Place all the behaviors and hooks related to the matching controller here.
+# All this logic will automatically be available in application.js.
+# You can use CoffeeScript in this file: http://coffeescript.org/
diff --git a/app/assets/stylesheets/api_controller.scss b/app/assets/stylesheets/api_controller.scss
new file mode 100644
index 0000000..9231518
--- /dev/null
+++ b/app/assets/stylesheets/api_controller.scss
@@ -0,0 +1,3 @@
+// Place all the styles related to the api_controller controller here.
+// They will automatically be included in application.css.
+// You can use Sass (SCSS) here: http://sass-lang.com/
diff --git a/app/assets/stylesheets/api_v1/messages.scss b/app/assets/stylesheets/api_v1/messages.scss
new file mode 100644
index 0000000..db6f927
--- /dev/null
+++ b/app/assets/stylesheets/api_v1/messages.scss
@@ -0,0 +1,3 @@
+// Place all the styles related to the api_v1::messages controller here.
+// They will automatically be included in application.css.
+// You can use Sass (SCSS) here: http://sass-lang.com/
diff --git a/app/controllers/api_controller_controller.rb b/app/controllers/api_controller_controller.rb
new file mode 100644
index 0000000..266c28c
--- /dev/null
+++ b/app/controllers/api_controller_controller.rb
@@ -0,0 +1,2 @@
+class ApiControllerController < ApplicationController
+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..0e3e4f7
--- /dev/null
+++ b/app/controllers/api_v1/messages_controller.rb
@@ -0,0 +1,7 @@
+class ApiV1::MessagesController < ApplicationController
+
+ def index
+ @messages = Message.all
+ end
+
+end
\ No newline at end of file
diff --git a/app/helpers/api_controller_helper.rb b/app/helpers/api_controller_helper.rb
new file mode 100644
index 0000000..45db3f1
--- /dev/null
+++ b/app/helpers/api_controller_helper.rb
@@ -0,0 +1,2 @@
+module ApiControllerHelper
+end
diff --git a/app/helpers/api_v1/messages_helper.rb b/app/helpers/api_v1/messages_helper.rb
new file mode 100644
index 0000000..21af019
--- /dev/null
+++ b/app/helpers/api_v1/messages_helper.rb
@@ -0,0 +1,2 @@
+module ApiV1::MessagesHelper
+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..455f427
--- /dev/null
+++ b/app/views/api_v1/messages/index.json.jbuilder
@@ -0,0 +1,4 @@
+
+json.data do
+ json.array! @messages, :id, :status, :category_name, :title, :content, :created_at
+end
\ No newline at end of file
diff --git a/config/routes.rb b/config/routes.rb
index 74d4dbf..3311f5e 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/spec/controllers/api_controller_controller_spec.rb b/spec/controllers/api_controller_controller_spec.rb
new file mode 100644
index 0000000..a71851e
--- /dev/null
+++ b/spec/controllers/api_controller_controller_spec.rb
@@ -0,0 +1,5 @@
+require 'rails_helper'
+
+RSpec.describe ApiControllerController, type: :controller do
+
+end
diff --git a/spec/controllers/api_v1/messages_controller_spec.rb b/spec/controllers/api_v1/messages_controller_spec.rb
new file mode 100644
index 0000000..e1f1525
--- /dev/null
+++ b/spec/controllers/api_v1/messages_controller_spec.rb
@@ -0,0 +1,5 @@
+require 'rails_helper'
+
+RSpec.describe ApiV1::MessagesController, type: :controller do
+
+end
diff --git a/spec/helpers/api_controller_helper_spec.rb b/spec/helpers/api_controller_helper_spec.rb
new file mode 100644
index 0000000..7a43a0c
--- /dev/null
+++ b/spec/helpers/api_controller_helper_spec.rb
@@ -0,0 +1,15 @@
+require 'rails_helper'
+
+# Specs in this file have access to a helper object that includes
+# the ApiControllerHelper. For example:
+#
+# describe ApiControllerHelper do
+# describe "string concat" do
+# it "concats two strings with spaces" do
+# expect(helper.concat_strings("this","that")).to eq("this that")
+# end
+# end
+# end
+RSpec.describe ApiControllerHelper, type: :helper do
+ pending "add some examples to (or delete) #{__FILE__}"
+end
diff --git a/spec/helpers/api_v1/messages_helper_spec.rb b/spec/helpers/api_v1/messages_helper_spec.rb
new file mode 100644
index 0000000..e078b0d
--- /dev/null
+++ b/spec/helpers/api_v1/messages_helper_spec.rb
@@ -0,0 +1,15 @@
+require 'rails_helper'
+
+# Specs in this file have access to a helper object that includes
+# the ApiV1::MessagesHelper. For example:
+#
+# describe ApiV1::MessagesHelper do
+# describe "string concat" do
+# it "concats two strings with spaces" do
+# expect(helper.concat_strings("this","that")).to eq("this that")
+# end
+# end
+# end
+RSpec.describe ApiV1::MessagesHelper, type: :helper do
+ pending "add some examples to (or delete) #{__FILE__}"
+end
From 2e16c252923d4c2bee341b1fe40f8aed76d5cfb0 Mon Sep 17 00:00:00 2001
From: Owen Ou
Date: Fri, 22 Jul 2016 18:28:14 +0800
Subject: [PATCH 5/6] Add Like & Subscription Model
---
app/controllers/api_controller_controller.rb | 1 +
app/models/like.rb | 4 ++++
app/models/message.rb | 7 +++++-
app/models/subscription.rb | 6 +++++
app/models/user.rb | 9 ++++++++
.../20160722101806_create_subscriptions.rb | 11 ++++++++++
db/migrate/20160722101811_create_likes.rb | 11 ++++++++++
db/schema.rb | 22 ++++++++++++++++++-
spec/models/like_spec.rb | 5 +++++
spec/models/subscription_spec.rb | 5 +++++
10 files changed, 79 insertions(+), 2 deletions(-)
create mode 100644 app/models/like.rb
create mode 100644 app/models/subscription.rb
create mode 100644 db/migrate/20160722101806_create_subscriptions.rb
create mode 100644 db/migrate/20160722101811_create_likes.rb
create mode 100644 spec/models/like_spec.rb
create mode 100644 spec/models/subscription_spec.rb
diff --git a/app/controllers/api_controller_controller.rb b/app/controllers/api_controller_controller.rb
index 266c28c..b7b884d 100644
--- a/app/controllers/api_controller_controller.rb
+++ b/app/controllers/api_controller_controller.rb
@@ -1,2 +1,3 @@
class ApiControllerController < ApplicationController
+
end
diff --git a/app/models/like.rb b/app/models/like.rb
new file mode 100644
index 0000000..3af785e
--- /dev/null
+++ b/app/models/like.rb
@@ -0,0 +1,4 @@
+class Like < ActiveRecord::Base
+ belongs_to :message
+ belongs_to :user
+end
diff --git a/app/models/message.rb b/app/models/message.rb
index 39397f2..986c54e 100644
--- a/app/models/message.rb
+++ b/app/models/message.rb
@@ -3,7 +3,12 @@ class Message < ActiveRecord::Base
belongs_to :user
has_many :comments, :dependent => :destroy
-
+ has_many :likes, :dependent => :destroy
+ has_many :likes_by, :through => :likes, :source => :user, :dependent => :destroy
+
+ has_many :subscriptions, :dependent => :destroy
+ has_many :subscriptions_by, :through => :likes, :source => :user, :dependent => :destroy
+
scope :pending, -> { where status: "pending" }
scope :completed, -> {where status: "completed" }
scope :within_days, -> (time){ where "created_at >= ?", Time.now - time.days }
diff --git a/app/models/subscription.rb b/app/models/subscription.rb
new file mode 100644
index 0000000..2a42ede
--- /dev/null
+++ b/app/models/subscription.rb
@@ -0,0 +1,6 @@
+class Subscription < ActiveRecord::Base
+
+ belongs_to :message
+ belongs_to :user
+
+end
diff --git a/app/models/user.rb b/app/models/user.rb
index 6d01aa9..0966f9b 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -7,12 +7,21 @@ class User < ActiveRecord::Base
has_many :messages
has_many :comments
+ has_many :likes, :dependent => :destroy
+ has_many :liked_messages, :through => :likes, :source => :message, :dependent => :destroy
+
+ has_many :subscriptions, :dependent => :destroy
+ has_many :subscriptions_by, :through => :likes, :source => :message, :dependent => :destroy
+
def display_name
self.email.split("@").first
end
def posts_count
# TODO: 請完成我
+
+
+
end
def words_count
diff --git a/db/migrate/20160722101806_create_subscriptions.rb b/db/migrate/20160722101806_create_subscriptions.rb
new file mode 100644
index 0000000..da33488
--- /dev/null
+++ b/db/migrate/20160722101806_create_subscriptions.rb
@@ -0,0 +1,11 @@
+class CreateSubscriptions < ActiveRecord::Migration
+ def change
+ create_table :subscriptions do |t|
+
+ t.integer :user_id, index: :true
+ t.integer :message_id, index: :true
+ t.timestamps null: false
+
+ end
+ end
+end
diff --git a/db/migrate/20160722101811_create_likes.rb b/db/migrate/20160722101811_create_likes.rb
new file mode 100644
index 0000000..4320e1b
--- /dev/null
+++ b/db/migrate/20160722101811_create_likes.rb
@@ -0,0 +1,11 @@
+class CreateLikes < ActiveRecord::Migration
+ def change
+ create_table :likes do |t|
+
+ t.integer :user_id, index: :true
+ t.integer :message_id, index: :true
+ t.timestamps null: false
+
+ end
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index ef7b5c0..f289d79 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: 20160722101811) do
create_table "comments", force: :cascade do |t|
t.text "content"
@@ -23,6 +23,16 @@
add_index "comments", ["message_id"], name: "index_comments_on_message_id"
+ create_table "likes", force: :cascade do |t|
+ t.integer "user_id"
+ 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 +46,16 @@
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 "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 "users", force: :cascade do |t|
t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false
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
From c60753e778e71ab1fbd7ef80d7aff7e4068ca384 Mon Sep 17 00:00:00 2001
From: Owen Ou
Date: Fri, 22 Jul 2016 18:32:16 +0800
Subject: [PATCH 6/6] minor fix
---
app/views/messages/show.html.erb | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/app/views/messages/show.html.erb b/app/views/messages/show.html.erb
index 4c13ee1..de4a492 100644
--- a/app/views/messages/show.html.erb
+++ b/app/views/messages/show.html.erb
@@ -21,13 +21,13 @@