From 3b7922bb6c9f001cd1415ba777ddc5148da8877e Mon Sep 17 00:00:00 2001
From: Tim Wu
Date: Fri, 22 Jul 2016 14:45:42 +0800
Subject: [PATCH 01/13] use ajax on delete
---
app/controllers/messages_controller.rb | 6 +++++-
app/views/messages/_delete.html.erb | 2 ++
app/views/messages/delete.js.erb | 1 +
app/views/messages/show.html.erb | 5 ++++-
4 files changed, 12 insertions(+), 2 deletions(-)
create mode 100644 app/views/messages/_delete.html.erb
create mode 100644 app/views/messages/delete.js.erb
diff --git a/app/controllers/messages_controller.rb b/app/controllers/messages_controller.rb
index 96f65e5..024798b 100644
--- a/app/controllers/messages_controller.rb
+++ b/app/controllers/messages_controller.rb
@@ -56,7 +56,11 @@ def destroy
@message = current_user.messages.find( params[:id] )
@message.destroy
- redirect_to root_path
+ respond_to do |format|
+ format.html{redirect_to :root}
+ format.js
+ end
+
end
protected
diff --git a/app/views/messages/_delete.html.erb b/app/views/messages/_delete.html.erb
new file mode 100644
index 0000000..1b04859
--- /dev/null
+++ b/app/views/messages/_delete.html.erb
@@ -0,0 +1,2 @@
+
+<%= link_to "Delete", message_comment_path(@message, comment), :method => :delete, :remote => true, :class => "btn btn-danger", :data => { :confirm => "Are u sure?"} %>
diff --git a/app/views/messages/delete.js.erb b/app/views/messages/delete.js.erb
new file mode 100644
index 0000000..fcd844f
--- /dev/null
+++ b/app/views/messages/delete.js.erb
@@ -0,0 +1 @@
+$("#delete-block").html("<%=j render(:partial => "delete")%>");
\ No newline at end of file
diff --git a/app/views/messages/show.html.erb b/app/views/messages/show.html.erb
index 41401f6..f0c6cd3 100644
--- a/app/views/messages/show.html.erb
+++ b/app/views/messages/show.html.erb
@@ -23,7 +23,10 @@
<% if comment.user == current_user %>
<%# TODO: 修改成 AJAX 版本的刪除 %>
- <%= link_to "Delete", message_comment_path(@message, comment), :method => :delete, :data => { :confirm => "Are u sure?"} %>
+ <%#= link_to "Delete", message_comment_path(@message, comment), :method => :delete, :data => { :confirm => "Are u sure?"} %>
+
+ <%= render "delete"%>
+
<% end %>
From 419ff805cb2eb80fe22ce4c698b1b8223e7e8ff9 Mon Sep 17 00:00:00 2001
From: Tim Wu
Date: Fri, 22 Jul 2016 15:14:09 +0800
Subject: [PATCH 02/13] improve N+1 queries efficiency
---
app/controllers/messages_controller.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/controllers/messages_controller.rb b/app/controllers/messages_controller.rb
index 024798b..e083767 100644
--- a/app/controllers/messages_controller.rb
+++ b/app/controllers/messages_controller.rb
@@ -4,7 +4,7 @@ class MessagesController < ApplicationController
def index
# TODO: fix N+1 queries for user and comments
- @messages = Message.order("id DESC").page( params[:page] )
+ @messages = Message.includes(:comments).order("id DESC").page( params[:page] )
if params[:status] == "pending"
# TODO: @messages = @messages.pending
From a488f2da7c1d4d9d990e70cfc7eccca1807ed633 Mon Sep 17 00:00:00 2001
From: Tim Wu
Date: Fri, 22 Jul 2016 15:42:42 +0800
Subject: [PATCH 03/13] refactor using activerecord scope
---
app/controllers/messages_controller.rb | 12 ++++++------
app/models/message.rb | 4 ++++
2 files changed, 10 insertions(+), 6 deletions(-)
diff --git a/app/controllers/messages_controller.rb b/app/controllers/messages_controller.rb
index e083767..dd1ea14 100644
--- a/app/controllers/messages_controller.rb
+++ b/app/controllers/messages_controller.rb
@@ -7,16 +7,16 @@ def index
@messages = Message.includes(:comments).order("id DESC").page( params[:page] )
if params[:status] == "pending"
- # TODO: @messages = @messages.pending
- @messages = @messages.where( :status => "pending" )
+ @messages = @messages.pending
+ # @messages = @messages.where( :status => "pending" )
elsif params[:status] == "completed"
- # TODO: @messages = @messages.completed
- @messages = @messages.where( :status => "completed" )
+ @messages = @messages.completed
+ # @messages = @messages.where( :status => "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)
+ # @messages = @messages.where( ["created_at >= ?", Time.now - params[:days].to_i.days ] )
end
end
diff --git a/app/models/message.rb b/app/models/message.rb
index e24a8b2..660cec1 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.to_i.days }
+
def last_comment_summary
self.comments.last.try(:content).try(:truncate, 20)
end
From 2ee43a81b5467d80c14df2650bafd4795130addb Mon Sep 17 00:00:00 2001
From: Tim Wu
Date: Fri, 22 Jul 2016 16:05:24 +0800
Subject: [PATCH 04/13] fix ajax on comment delete
---
app/controllers/comments_controller.rb | 5 ++++-
app/controllers/messages_controller.rb | 9 +++------
app/views/messages/_delete.html.erb | 2 --
app/views/messages/delete.js.erb | 1 -
app/views/messages/destroy.js.erb | 1 +
app/views/messages/show.html.erb | 21 +++++++++------------
6 files changed, 17 insertions(+), 22 deletions(-)
delete mode 100644 app/views/messages/_delete.html.erb
delete mode 100644 app/views/messages/delete.js.erb
create mode 100644 app/views/messages/destroy.js.erb
diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb
index e9d6aaa..7a70d95 100644
--- a/app/controllers/comments_controller.rb
+++ b/app/controllers/comments_controller.rb
@@ -16,7 +16,10 @@ def destroy
@comment = current_user.comments.find( params[:id] )
@comment.destroy
- redirect_to :back
+ respond_to do |format|
+ format.html { redirect_to :back }
+ format.js
+ end
end
protected
diff --git a/app/controllers/messages_controller.rb b/app/controllers/messages_controller.rb
index dd1ea14..07a1f3e 100644
--- a/app/controllers/messages_controller.rb
+++ b/app/controllers/messages_controller.rb
@@ -15,8 +15,8 @@ def index
end
if params[:days]
- @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)
+ @messages = @messages.where( ["created_at >= ?", Time.now - params[:days].to_i.days ] )
end
end
@@ -56,10 +56,7 @@ def destroy
@message = current_user.messages.find( params[:id] )
@message.destroy
- respond_to do |format|
- format.html{redirect_to :root}
- format.js
- end
+ redirect_to root_path
end
diff --git a/app/views/messages/_delete.html.erb b/app/views/messages/_delete.html.erb
deleted file mode 100644
index 1b04859..0000000
--- a/app/views/messages/_delete.html.erb
+++ /dev/null
@@ -1,2 +0,0 @@
-
-<%= link_to "Delete", message_comment_path(@message, comment), :method => :delete, :remote => true, :class => "btn btn-danger", :data => { :confirm => "Are u sure?"} %>
diff --git a/app/views/messages/delete.js.erb b/app/views/messages/delete.js.erb
deleted file mode 100644
index fcd844f..0000000
--- a/app/views/messages/delete.js.erb
+++ /dev/null
@@ -1 +0,0 @@
-$("#delete-block").html("<%=j render(:partial => "delete")%>");
\ No newline at end of file
diff --git a/app/views/messages/destroy.js.erb b/app/views/messages/destroy.js.erb
new file mode 100644
index 0000000..0982f0e
--- /dev/null
+++ b/app/views/messages/destroy.js.erb
@@ -0,0 +1 @@
+$("#delete-block %>").remove();
\ No newline at end of file
diff --git a/app/views/messages/show.html.erb b/app/views/messages/show.html.erb
index f0c6cd3..a24f3e3 100644
--- a/app/views/messages/show.html.erb
+++ b/app/views/messages/show.html.erb
@@ -18,17 +18,14 @@
<% 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 %>
- <%# TODO: 修改成 AJAX 版本的刪除 %>
- <%#= link_to "Delete", message_comment_path(@message, comment), :method => :delete, :data => { :confirm => "Are u sure?"} %>
-
- <%= render "delete"%>
-
- <% end %>
-
-
+
+
<%= simple_format comment.content %> at <%= comment.created_at.to_s(:short) %> by <%= comment.user.display_name %>
+
+ <% if comment.user == current_user %>
+ <%# TODO: 修改成 AJAX 版本的刪除 %>
+ <%= link_to "Delete", message_comment_path(@message, comment), :method => :delete, :remote => true, :data => { :confirm => "Are u sure?"} %>
+ <% end %>
+
+
<% end %>
From a8b3f6e99e733940536d56ee1c75ea1290ebf62c Mon Sep 17 00:00:00 2001
From: Tim Wu
Date: Fri, 22 Jul 2016 16:14:16 +0800
Subject: [PATCH 05/13] fix comment ajax
---
app/views/messages/show.html.erb | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/app/views/messages/show.html.erb b/app/views/messages/show.html.erb
index a24f3e3..b446374 100644
--- a/app/views/messages/show.html.erb
+++ b/app/views/messages/show.html.erb
@@ -18,14 +18,15 @@
<% 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 %>
- <%# TODO: 修改成 AJAX 版本的刪除 %>
- <%= link_to "Delete", message_comment_path(@message, comment), :method => :delete, :remote => true, :data => { :confirm => "Are u sure?"} %>
+ <%# TODO: 修改成 AJAX 版本的刪除 %>
+
+ <%= link_to "Delete", message_comment_path(@message, comment), :method => :delete, :remote => true %>
+
<% end %>
-
<% end %>
From 4d70dae16430559544e071d4baad489a0f22d1fd Mon Sep 17 00:00:00 2001
From: Tim Wu
Date: Fri, 22 Jul 2016 16:21:20 +0800
Subject: [PATCH 06/13] meet post_count rspec
---
app/models/user.rb | 1 +
1 file changed, 1 insertion(+)
diff --git a/app/models/user.rb b/app/models/user.rb
index 6d01aa9..8f74cad 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -13,6 +13,7 @@ def display_name
def posts_count
# TODO: 請完成我
+ self.messages.size + self.comments.size
end
def words_count
From 99341f03530b342b719d036b1a249ea7f2c69c60 Mon Sep 17 00:00:00 2001
From: Tim Wu
Date: Fri, 22 Jul 2016 17:01:24 +0800
Subject: [PATCH 07/13] add messages json api
---
app/assets/javascripts/api/v1/messages.coffee | 3 +++
app/assets/stylesheets/api/v1/messages.scss | 3 +++
app/controllers/api/v1/messages_controller.rb | 5 +++++
app/helpers/api/v1/messages_helper.rb | 2 ++
app/views/api/v1/messages/index.html.erb | 8 ++++++++
app/views/api/v1/messages/index.json.jbuilder | 14 ++++++++++++++
config/routes.rb | 6 ++++++
.../api/v1/messages_controller_spec.rb | 5 +++++
spec/helpers/api/v1/messages_helper_spec.rb | 15 +++++++++++++++
9 files changed, 61 insertions(+)
create mode 100644 app/assets/javascripts/api/v1/messages.coffee
create mode 100644 app/assets/stylesheets/api/v1/messages.scss
create mode 100644 app/controllers/api/v1/messages_controller.rb
create mode 100644 app/helpers/api/v1/messages_helper.rb
create mode 100644 app/views/api/v1/messages/index.html.erb
create mode 100644 app/views/api/v1/messages/index.json.jbuilder
create mode 100644 spec/controllers/api/v1/messages_controller_spec.rb
create mode 100644 spec/helpers/api/v1/messages_helper_spec.rb
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/v1/messages.scss b/app/assets/stylesheets/api/v1/messages.scss
new file mode 100644
index 0000000..f88adcc
--- /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/v1/messages_controller.rb b/app/controllers/api/v1/messages_controller.rb
new file mode 100644
index 0000000..bfbb5ea
--- /dev/null
+++ b/app/controllers/api/v1/messages_controller.rb
@@ -0,0 +1,5 @@
+class Api::V1::MessagesController < ApplicationController
+ def index
+ @messages = Message.all
+ end
+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..c164d3c
--- /dev/null
+++ b/app/helpers/api/v1/messages_helper.rb
@@ -0,0 +1,2 @@
+module Api::V1::MessagesHelper
+end
diff --git a/app/views/api/v1/messages/index.html.erb b/app/views/api/v1/messages/index.html.erb
new file mode 100644
index 0000000..04b29be
--- /dev/null
+++ b/app/views/api/v1/messages/index.html.erb
@@ -0,0 +1,8 @@
+
\ No newline at end of file
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..7c8c47a
--- /dev/null
+++ b/app/views/api/v1/messages/index.json.jbuilder
@@ -0,0 +1,14 @@
+// 包括 id, status, category_name, title, content 和 created_at
+json.data do
+ json.array! (@messages) do |message|
+
+ json.id message.id
+ json.status message.status
+ json.category_name category_name
+ json.title message.title
+ json.content message.content
+ json.created_at message.created_at
+ end
+end
+
+
diff --git a/config/routes.rb b/config/routes.rb
index 74d4dbf..9f2332c 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -5,6 +5,12 @@
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/v1/messages_controller_spec.rb b/spec/controllers/api/v1/messages_controller_spec.rb
new file mode 100644
index 0000000..2e829c7
--- /dev/null
+++ b/spec/controllers/api/v1/messages_controller_spec.rb
@@ -0,0 +1,5 @@
+require 'rails_helper'
+
+RSpec.describe Api::V1::MessagesController, type: :controller do
+
+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..461b495
--- /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 Api::V1::MessagesHelper. For example:
+#
+# describe Api::V1::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 Api::V1::MessagesHelper, type: :helper do
+ pending "add some examples to (or delete) #{__FILE__}"
+end
From 5a65b4d7667fa0a6c86290d455386bb33b6e6c7a Mon Sep 17 00:00:00 2001
From: Tim Wu
Date: Fri, 22 Jul 2016 17:29:29 +0800
Subject: [PATCH 08/13] add subscription and like models
---
app/models/like.rb | 4 ++++
app/models/message.rb | 6 +++++
app/models/subscription.rb | 4 ++++
app/models/user.rb | 6 +++++
app/views/messages/show.html.erb | 9 ++++++++
config/routes.rb | 8 ++++++-
.../20160722090200_create_subscriptions.rb | 11 ++++++++++
db/migrate/20160722090224_create_likes.rb | 9 ++++++++
db/schema.rb | 22 ++++++++++++++++++-
spec/models/like_spec.rb | 5 +++++
spec/models/subscription_spec.rb | 5 +++++
11 files changed, 87 insertions(+), 2 deletions(-)
create mode 100644 app/models/like.rb
create mode 100644 app/models/subscription.rb
create mode 100644 db/migrate/20160722090200_create_subscriptions.rb
create mode 100644 db/migrate/20160722090224_create_likes.rb
create mode 100644 spec/models/like_spec.rb
create mode 100644 spec/models/subscription_spec.rb
diff --git a/app/models/like.rb b/app/models/like.rb
new file mode 100644
index 0000000..a8a243f
--- /dev/null
+++ b/app/models/like.rb
@@ -0,0 +1,4 @@
+class Like < ActiveRecord::Base
+ belongs_to :user
+ belongs_to :message
+end
diff --git a/app/models/message.rb b/app/models/message.rb
index 660cec1..ba54112 100644
--- a/app/models/message.rb
+++ b/app/models/message.rb
@@ -4,6 +4,12 @@ class Message < ActiveRecord::Base
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.to_i.days }
diff --git a/app/models/subscription.rb b/app/models/subscription.rb
new file mode 100644
index 0000000..b431527
--- /dev/null
+++ b/app/models/subscription.rb
@@ -0,0 +1,4 @@
+class Subscription < ActiveRecord::Base
+ belongs_to :user
+ belongs_to :message
+end
diff --git a/app/models/user.rb b/app/models/user.rb
index 8f74cad..96a48b0 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -7,6 +7,12 @@ class User < ActiveRecord::Base
has_many :messages
has_many :comments
+ has_many :likes, :dependent => :destroy
+ has_many :like_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
diff --git a/app/views/messages/show.html.erb b/app/views/messages/show.html.erb
index b446374..a9ea23f 100644
--- a/app/views/messages/show.html.erb
+++ b/app/views/messages/show.html.erb
@@ -2,6 +2,15 @@
<%= simple_format @message.content %>
+Likes
+ <% @message.likes_by.each do |user| %>
+ <%= user.email.split("@").first%>
+ <% end %>
+ Subscribed
+ <% @message.subscriptions_by.each do |user| %>
+ <%= user.email.split("@").first%>
+ <% end %>
+
Comments list
<%= form_for [@message, @comment] do |f| %>
diff --git a/config/routes.rb b/config/routes.rb
index 9f2332c..9da7382 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -3,6 +3,13 @@
resources :messages do
resources :comments
+
+ member do
+ post :like
+ post :dislike
+ post :subscribe
+ post :unsubscribe
+ end
end
scope :path => '/api/v1/', :module => "api_v1", :as => 'v1', :defaults => { :format => :json } do
@@ -10,7 +17,6 @@
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/20160722090200_create_subscriptions.rb b/db/migrate/20160722090200_create_subscriptions.rb
new file mode 100644
index 0000000..8a1ba1c
--- /dev/null
+++ b/db/migrate/20160722090200_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/20160722090224_create_likes.rb b/db/migrate/20160722090224_create_likes.rb
new file mode 100644
index 0000000..40ae4af
--- /dev/null
+++ b/db/migrate/20160722090224_create_likes.rb
@@ -0,0 +1,9 @@
+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..60304ef 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: 20160722090224) 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 b0eb8e92c6b579c5ef8ef27b130b56517dbc2373 Mon Sep 17 00:00:00 2001
From: Tim Wu
Date: Fri, 22 Jul 2016 17:32:51 +0800
Subject: [PATCH 09/13] edit rake dev:fake
---
lib/tasks/dev.rake | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/lib/tasks/dev.rake b/lib/tasks/dev.rake
index 4673e72..1742f3b 100644
--- a/lib/tasks/dev.rake
+++ b/lib/tasks/dev.rake
@@ -17,6 +17,12 @@ namespace :dev do
:content => Faker::Lorem.paragraph,
:user => users.sample,
:created_at => Time.now - rand(30).days )
+ users.sample(2).each do |u|
+ Subscription.create!(:user => u, :message => m)
+ end
+ users.sample(2).each do |u|
+ Like.create!(:user => u, :message => m)
+ end
5.times do
m.comments.create!( :content => Faker::Lorem.paragraph,
:user => users.sample )
From 6247fe4eb17ce5794bcefa11d1c5e79ad73b4584 Mon Sep 17 00:00:00 2001
From: Tim Wu
Date: Fri, 22 Jul 2016 17:37:50 +0800
Subject: [PATCH 10/13] remove html.erb for api index
---
app/views/api/v1/messages/index.html.erb | 8 --------
config/routes.rb | 2 +-
2 files changed, 1 insertion(+), 9 deletions(-)
delete mode 100644 app/views/api/v1/messages/index.html.erb
diff --git a/app/views/api/v1/messages/index.html.erb b/app/views/api/v1/messages/index.html.erb
deleted file mode 100644
index 04b29be..0000000
--- a/app/views/api/v1/messages/index.html.erb
+++ /dev/null
@@ -1,8 +0,0 @@
-
\ No newline at end of file
diff --git a/config/routes.rb b/config/routes.rb
index 9da7382..c280876 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -13,7 +13,7 @@
end
scope :path => '/api/v1/', :module => "api_v1", :as => 'v1', :defaults => { :format => :json } do
- resources :messages
+ resources :messages
end
From 0267e286c6185ee5086f4ec4d40ae2e8a50b5883 Mon Sep 17 00:00:00 2001
From: Tim Wu
Date: Fri, 22 Jul 2016 18:00:48 +0800
Subject: [PATCH 11/13] add rspec for words_count
---
app/controllers/api/v1/messages_controller.rb | 5 +++++
app/views/api/v1/messages/index.html.erb | 9 +++++++++
app/views/api/v1/messages/index.json.jbuilder | 2 --
spec/models/user_spec.rb | 14 +++++++++++++-
4 files changed, 27 insertions(+), 3 deletions(-)
create mode 100644 app/views/api/v1/messages/index.html.erb
diff --git a/app/controllers/api/v1/messages_controller.rb b/app/controllers/api/v1/messages_controller.rb
index bfbb5ea..1b96134 100644
--- a/app/controllers/api/v1/messages_controller.rb
+++ b/app/controllers/api/v1/messages_controller.rb
@@ -1,5 +1,10 @@
class Api::V1::MessagesController < ApplicationController
def index
@messages = Message.all
+
+ respond_to do |format|
+ format.html
+ format.js
+ end
end
end
diff --git a/app/views/api/v1/messages/index.html.erb b/app/views/api/v1/messages/index.html.erb
new file mode 100644
index 0000000..b1db39d
--- /dev/null
+++ b/app/views/api/v1/messages/index.html.erb
@@ -0,0 +1,9 @@
+<% @messages.each do |m|%>
+ <%=m.id%> |
+ <%=m.status%> |
+ <%=m.category_name%> |
+ <%=m.title%> |
+ <%=m.content%> |
+ <%=m.created_at%> |
+<% end %>
+
diff --git a/app/views/api/v1/messages/index.json.jbuilder b/app/views/api/v1/messages/index.json.jbuilder
index 7c8c47a..e5a39e5 100644
--- a/app/views/api/v1/messages/index.json.jbuilder
+++ b/app/views/api/v1/messages/index.json.jbuilder
@@ -1,7 +1,5 @@
-// 包括 id, status, category_name, title, content 和 created_at
json.data do
json.array! (@messages) do |message|
-
json.id message.id
json.status message.status
json.category_name category_name
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index 528cc38..f3fc259 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -25,11 +25,23 @@
describe "#words_count" do
before do
# TODO: 加 Message 和 Comment 測試資料
+ @other_user = User.create!(:email => "ooxx@example.org", :password => "12345678")
+
+ m1 =Message.create!(:user => @user,
+ :title => Faker::Lorem.words(5),
+ :content => Faker::Lorem.words(5))
+ Comment.create!(:user => @other_user,
+ :content => Faker::Lorem.words(20),
+ :message_id => m1)
+ Comment.create!(:user => @user,
+ :content => Faker::Lorem.words(5),
+ :message_id => m1)
end
it "加總該使用者的所有 Mesasge 和 Comment 的總字數" do
# TODO: 測試 words_count 方法
-
+ expect(@user.words_count).to eq(15)
+ expect(@other_user.words_count).to eq(20)
end
end
From 9f71be899c6d77bb01ce68ca6a71a5cfcdfc3a8e Mon Sep 17 00:00:00 2001
From: Tim Wu
Date: Fri, 22 Jul 2016 18:13:02 +0800
Subject: [PATCH 12/13] fix N+1 efficiency
---
app/controllers/messages_controller.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/controllers/messages_controller.rb b/app/controllers/messages_controller.rb
index 07a1f3e..66aedee 100644
--- a/app/controllers/messages_controller.rb
+++ b/app/controllers/messages_controller.rb
@@ -4,7 +4,7 @@ class MessagesController < ApplicationController
def index
# TODO: fix N+1 queries for user and comments
- @messages = Message.includes(:comments).order("id DESC").page( params[:page] )
+ @messages = Message.includes(:comments, :user).order("id DESC").page( params[:page] )
if params[:status] == "pending"
@messages = @messages.pending
From c2a200e9a715f858a107011d8c5397218a335f26 Mon Sep 17 00:00:00 2001
From: Tim Wu
Date: Fri, 22 Jul 2016 19:13:33 +0800
Subject: [PATCH 13/13] fix api controller error
---
.../javascripts/{api/v1 => api_v1}/messages.coffee | 0
.../stylesheets/{api/v1 => api_v1}/messages.scss | 2 +-
app/controllers/api/v1/messages_controller.rb | 10 ----------
app/controllers/api_v1/messages_controller.rb | 7 +++++++
app/helpers/api/v1/messages_helper.rb | 2 --
app/helpers/api_v1/messages_helper.rb | 2 ++
app/views/api/v1/messages/index.html.erb | 9 ---------
app/views/api/v1/messages/index.json.jbuilder | 12 ------------
app/views/api_v1/messages/index.json.jbuilder | 10 ++++++++++
config/routes.rb | 6 +++++-
spec/controllers/api/v1/messages_controller_spec.rb | 5 -----
spec/controllers/api_v1/messages_controller_spec.rb | 5 +++++
.../{api/v1 => api_v1}/messages_helper_spec.rb | 6 +++---
13 files changed, 33 insertions(+), 43 deletions(-)
rename app/assets/javascripts/{api/v1 => api_v1}/messages.coffee (100%)
rename app/assets/stylesheets/{api/v1 => api_v1}/messages.scss (65%)
delete mode 100644 app/controllers/api/v1/messages_controller.rb
create mode 100644 app/controllers/api_v1/messages_controller.rb
delete mode 100644 app/helpers/api/v1/messages_helper.rb
create mode 100644 app/helpers/api_v1/messages_helper.rb
delete mode 100644 app/views/api/v1/messages/index.html.erb
delete mode 100644 app/views/api/v1/messages/index.json.jbuilder
create mode 100644 app/views/api_v1/messages/index.json.jbuilder
delete mode 100644 spec/controllers/api/v1/messages_controller_spec.rb
create mode 100644 spec/controllers/api_v1/messages_controller_spec.rb
rename spec/helpers/{api/v1 => api_v1}/messages_helper_spec.rb (70%)
diff --git a/app/assets/javascripts/api/v1/messages.coffee b/app/assets/javascripts/api_v1/messages.coffee
similarity index 100%
rename from app/assets/javascripts/api/v1/messages.coffee
rename to app/assets/javascripts/api_v1/messages.coffee
diff --git a/app/assets/stylesheets/api/v1/messages.scss b/app/assets/stylesheets/api_v1/messages.scss
similarity index 65%
rename from app/assets/stylesheets/api/v1/messages.scss
rename to app/assets/stylesheets/api_v1/messages.scss
index f88adcc..db6f927 100644
--- a/app/assets/stylesheets/api/v1/messages.scss
+++ b/app/assets/stylesheets/api_v1/messages.scss
@@ -1,3 +1,3 @@
-// Place all the styles related to the api/v1::messages controller here.
+// 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/v1/messages_controller.rb b/app/controllers/api/v1/messages_controller.rb
deleted file mode 100644
index 1b96134..0000000
--- a/app/controllers/api/v1/messages_controller.rb
+++ /dev/null
@@ -1,10 +0,0 @@
-class Api::V1::MessagesController < ApplicationController
- def index
- @messages = Message.all
-
- respond_to do |format|
- format.html
- format.js
- end
- end
-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..af08b11
--- /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
diff --git a/app/helpers/api/v1/messages_helper.rb b/app/helpers/api/v1/messages_helper.rb
deleted file mode 100644
index c164d3c..0000000
--- a/app/helpers/api/v1/messages_helper.rb
+++ /dev/null
@@ -1,2 +0,0 @@
-module Api::V1::MessagesHelper
-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.html.erb b/app/views/api/v1/messages/index.html.erb
deleted file mode 100644
index b1db39d..0000000
--- a/app/views/api/v1/messages/index.html.erb
+++ /dev/null
@@ -1,9 +0,0 @@
-<% @messages.each do |m|%>
- <%=m.id%> |
- <%=m.status%> |
- <%=m.category_name%> |
- <%=m.title%> |
- <%=m.content%> |
- <%=m.created_at%> |
-<% end %>
-
diff --git a/app/views/api/v1/messages/index.json.jbuilder b/app/views/api/v1/messages/index.json.jbuilder
deleted file mode 100644
index e5a39e5..0000000
--- a/app/views/api/v1/messages/index.json.jbuilder
+++ /dev/null
@@ -1,12 +0,0 @@
-json.data do
- json.array! (@messages) do |message|
- json.id message.id
- json.status message.status
- json.category_name category_name
- json.title message.title
- json.content message.content
- json.created_at message.created_at
- end
-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..3ceeffa
--- /dev/null
+++ b/app/views/api_v1/messages/index.json.jbuilder
@@ -0,0 +1,10 @@
+json.data do
+ json.array!(@message) do |message|
+ 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
+ end
\ No newline at end of file
diff --git a/config/routes.rb b/config/routes.rb
index c280876..e008dfc 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -1,6 +1,8 @@
Rails.application.routes.draw do
devise_for :users
+
+
resources :messages do
resources :comments
@@ -12,11 +14,13 @@
end
end
- scope :path => '/api/v1/', :module => "api_v1", :as => 'v1', :defaults => { :format => :json } do
+ 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/v1/messages_controller_spec.rb b/spec/controllers/api/v1/messages_controller_spec.rb
deleted file mode 100644
index 2e829c7..0000000
--- a/spec/controllers/api/v1/messages_controller_spec.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-require 'rails_helper'
-
-RSpec.describe Api::V1::MessagesController, 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/v1/messages_helper_spec.rb b/spec/helpers/api_v1/messages_helper_spec.rb
similarity index 70%
rename from spec/helpers/api/v1/messages_helper_spec.rb
rename to spec/helpers/api_v1/messages_helper_spec.rb
index 461b495..e078b0d 100644
--- a/spec/helpers/api/v1/messages_helper_spec.rb
+++ b/spec/helpers/api_v1/messages_helper_spec.rb
@@ -1,15 +1,15 @@
require 'rails_helper'
# Specs in this file have access to a helper object that includes
-# the Api::V1::MessagesHelper. For example:
+# the ApiV1::MessagesHelper. For example:
#
-# describe Api::V1::MessagesHelper do
+# 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 Api::V1::MessagesHelper, type: :helper do
+RSpec.describe ApiV1::MessagesHelper, type: :helper do
pending "add some examples to (or delete) #{__FILE__}"
end