Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions app/controllers/api_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
class ApiController < ActionController::Base
end
9 changes: 9 additions & 0 deletions app/controllers/api_v1/messages_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
class ApiV1::MessagesController < ApiController


# GET http://localhost:3000/api/v1/messages.json
def index
@messages = Message.all
end
end

13 changes: 10 additions & 3 deletions app/controllers/comments_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,16 @@ def create

def destroy
@comment = current_user.comments.find( params[:id] )
@comment.destroy

redirect_to :back
if @comment.user != current_user
render :back, alert: "你不是作者,沒有權限!"
else
@comment.destroy
end

respond_to do |format|
# format.html { redirect_to message_path(@message) }
format.js
end
end

protected
Expand Down
8 changes: 4 additions & 4 deletions app/controllers/messages_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,19 @@ 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(:user, :comments).order("id DESC").page( params[:page] )

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

Expand Down
4 changes: 4 additions & 0 deletions app/models/like.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
class Like < ActiveRecord::Base
belongs_to :user
belongs_to :message
end
10 changes: 10 additions & 0 deletions app/models/message.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,16 @@ class Message < ActiveRecord::Base

has_many :comments, :dependent => :destroy

has_many :likes, dependent: :destroy
has_many :liked_messages, through: :likes, source: :user

has_many :subscriptions, dependent: :destroy
has_many :sub_messages, through: :subscriptions, source: :user

scope :completed, -> { where( :status => "completed" ) }
scope :pending, -> { where( :status => "pending" ) }
scope :within_days, -> (date){ where( "created_at >= ?", Time.now - date.days ) }

def last_comment_summary
self.comments.last.try(:content).try(:truncate, 20)
end
Expand Down
5 changes: 5 additions & 0 deletions app/models/subscription.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class Subscription < ActiveRecord::Base
belongs_to :user
belongs_to :message

end
7 changes: 7 additions & 0 deletions app/models/user.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,20 @@ class User < ActiveRecord::Base

has_many :messages
has_many :comments

has_many :likes, dependent: :destroy
has_many :liked_messages, through: :likes, source: :message

has_many :subscriptions, dependent: :destroy
has_many :sub_messages, through: :subscriptions, source: :message

def display_name
self.email.split("@").first
end

def posts_count
# TODO: 請完成我
self.messages.count + self.comments.count
end

def words_count
Expand Down
1 change: 1 addition & 0 deletions app/views/api_v1/messages/_message.json.jbuilder
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
json.(message, :status, :category_name, :title, :content, :created_at)
7 changes: 7 additions & 0 deletions app/views/api_v1/messages/index.json.jbuilder
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
json.array! @messages do |message|
json.(message, :id)

json.detalis do
json.partial! message
end
end
1 change: 1 addition & 0 deletions app/views/comments/destroy.js.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
$('#comment-<%= @comment.id %>').remove();
31 changes: 24 additions & 7 deletions app/views/messages/show.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,20 @@

<%= simple_format @message.content %>

<h3>Who likes this message</h3>
<ul>
<% @message.liked_messages.each do |user| %>
<li><%= user.email if user %></li>
<% end %>
</ul>

<h3>Who subscribes this message</h3>
<ul>
<% @message.sub_messages.each do |user| %>
<li><%= user.email if user %></li>
<% end %>
</ul>

<h2>Comments list</h2>

<%= form_for [@message, @comment] do |f| %>
Expand All @@ -18,14 +32,17 @@
<% end %>

<% @message.comments.each do |comment| %>

<div id="comment-<%= comment.id %>">
<p ><%= simple_format comment.content %> at <%= comment.created_at.to_s(:short) %> by <%= comment.user.display_name %>

<p><%= 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?"} %>
<% end %>
</p>
<% 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 %>
</p>
</div>

<% end %>


5 changes: 5 additions & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@
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".

Expand Down
12 changes: 12 additions & 0 deletions db/migrate/20161007150958_create_subscriptions.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
class CreateSubscriptions < ActiveRecord::Migration
def change
create_table :subscriptions do |t|
t.integer :user_id
t.integer :message_id
t.index :user_id
t.index :message_id

t.timestamps null: false
end
end
end
12 changes: 12 additions & 0 deletions db/migrate/20161007151005_create_likes.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
class CreateLikes < ActiveRecord::Migration
def change
create_table :likes do |t|
t.integer :user_id
t.integer :message_id
t.index :user_id
t.index :message_id

t.timestamps null: false
end
end
end
22 changes: 21 additions & 1 deletion db/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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: 20161007151005) do

create_table "comments", force: :cascade do |t|
t.text "content"
Expand All @@ -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"
Expand All @@ -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
Expand Down
3 changes: 3 additions & 0 deletions lib/tasks/dev.rake
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ namespace :dev do
:content => Faker::Lorem.paragraph,
:user => users.sample,
:created_at => Time.now - rand(30).days )
m.liked_messages << users.sample(2)
m.sub_messages << users.sample(2)

5.times do
m.comments.create!( :content => Faker::Lorem.paragraph,
:user => users.sample )
Expand Down
11 changes: 7 additions & 4 deletions spec/models/user_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@

describe "#posts_count" do
before do
other_user = User.create!( :email => "ooxx@example.org", :password => "12345678")
m1 = Message.create!( :user => other_user )
Comment.create!( :user => other_user, :message => m1 )
@other_user = User.create!( :email => "ooxx@example.org", :password => "12345678")
m1 = Message.create!( :user => @other_user )
Comment.create!( :user => @other_user, :message => m1 )

m2 = Message.create!( :user => @user )
Comment.create!( :user => @user, :message => m2 )
Expand All @@ -19,17 +19,20 @@

it "回傳該使用者的總 Mesasge 數量加 Comment 數量" do
expect( @user.posts_count ).to eq(3)
expect( @other_user.posts_count ).to eq(2)
end
end

describe "#words_count" do
before do
# TODO: 加 Message 和 Comment 測試資料
m1 = Message.create!( :user => @user, title: "foo sss", content: "bar xxx" )
c1 = Comment.create!( :user => @user, :message => m1, content:"foo bar" )
end

it "加總該使用者的所有 Mesasge 和 Comment 的總字數" do
# TODO: 測試 words_count 方法

expect( @user.words_count ).to eq(6)
end
end

Expand Down