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