From f90e649cc6867e39512285917ba836ebc2d67a1f Mon Sep 17 00:00:00 2001 From: Murphy Stroppa Date: Tue, 9 Jun 2015 19:36:51 -0700 Subject: [PATCH 01/12] Posts can be edited and deleted. Comment model is created and associated with the Posts but is not yet creatable on the webpage. Other formatting has been done. --- .DS_Store | Bin 0 -> 6148 bytes app/assets/javascripts/posts.coffee | 3 ++ app/assets/stylesheets/posts.scss | 3 ++ app/controllers/posts_controller.rb | 48 +++++++++++++++++ app/helpers/posts_helper.rb | 2 + app/models/category.rb | 3 ++ app/models/comment.rb | 6 +++ app/models/contact.rb | 3 ++ app/models/post.rb | 6 +++ app/models/title.rb | 2 - app/views/layouts/application.html.erb | 6 +-- app/views/posts/_form.html.erb | 19 +++++++ app/views/posts/edit.html.erb | 5 ++ app/views/posts/index.html.erb | 11 ++++ app/views/posts/new.html.erb | 3 ++ app/views/posts/show.html.erb | 20 +++++++ config/routes.rb | 55 ++------------------ db/.DS_Store | Bin 0 -> 6148 bytes db/migrate/20150609015548_create_titles.rb | 9 ---- db/migrate/20150609024027_create_posts.rb | 10 ++++ db/schema.rb | 13 ++++- test/controllers/posts_controller_test.rb | 7 +++ test/fixtures/{titles.yml => posts.yml} | 2 + test/models/{title_test.rb => post_test.rb} | 2 +- 24 files changed, 170 insertions(+), 68 deletions(-) create mode 100644 .DS_Store create mode 100644 app/assets/javascripts/posts.coffee create mode 100644 app/assets/stylesheets/posts.scss create mode 100644 app/controllers/posts_controller.rb create mode 100644 app/helpers/posts_helper.rb create mode 100644 app/models/post.rb delete mode 100644 app/models/title.rb create mode 100644 app/views/posts/_form.html.erb create mode 100644 app/views/posts/edit.html.erb create mode 100644 app/views/posts/index.html.erb create mode 100644 app/views/posts/new.html.erb create mode 100644 app/views/posts/show.html.erb create mode 100644 db/.DS_Store delete mode 100644 db/migrate/20150609015548_create_titles.rb create mode 100644 db/migrate/20150609024027_create_posts.rb create mode 100644 test/controllers/posts_controller_test.rb rename test/fixtures/{titles.yml => posts.yml} (78%) rename test/models/{title_test.rb => post_test.rb} (64%) diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..238215e71e9e208266f164b392de324db03cf02c GIT binary patch literal 6148 zcmeHK!AiqG5Ph4JQW2#m(ObZ~(6b&wiTD9M3u;2EU`!6_eg8xK48Os%AL7xwGrQ9? z+q72|nSt52nVGkfyg)V!z)Y9L1Q-JtkuyenG;A@>v-d2L$RVNOH72vXD(haI2L7%B z{O)4hqDK9==)S+BlXa%7vaDD(Iq>oPb>JRGIAvAr$kg|p)r@7*5IHJ5VU7nZ!fxm9 zoB1t0BNVs`d8ePmbMa37>%}#FBVL z3Hl6EN76wRPz6+hUsizjY_`$9M;%oGRX`PJ72xkfLe7{9T95A2L4!L25DqBpjOKin zU``^K3R;hpAv2yz=&44I7{=2no=9CPXgzv5j2u3UbT)EAF|IqUpSW_E)T557fGQ9w z5c|t9@Bf#(&;KDwuT%k5;9n_V2H7l|(j&><+Iu+OYZLMtayG8B9$N}c+*VArycHjl aJEM5Q6T(!`dZY-M{s=f3bWjC;RDo|;fL@jW literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/posts.coffee b/app/assets/javascripts/posts.coffee new file mode 100644 index 0000000..24f83d1 --- /dev/null +++ b/app/assets/javascripts/posts.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/posts.scss b/app/assets/stylesheets/posts.scss new file mode 100644 index 0000000..1a7e153 --- /dev/null +++ b/app/assets/stylesheets/posts.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the posts 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/posts_controller.rb b/app/controllers/posts_controller.rb new file mode 100644 index 0000000..5dde437 --- /dev/null +++ b/app/controllers/posts_controller.rb @@ -0,0 +1,48 @@ +class PostsController < ApplicationController + + def index + @posts = Post.all + end + + def new + @post = Post.new + end + + def create + post_params = params.require(:post).permit(:title, :body) + @post = Post.new post_params + if @post.save + redirect_to posts_path + else + flash[:alert] = "Post failed to create. Please correct errors." + render :new + end + end + + def show + @post = Post.find params[:id] + end + + def destroy + @post = Post.find params[:id] + @post.destroy + flash[:notice] = "Successfully deleted post!" + redirect_to posts_path + end + + def edit + @post = Post.find params[:id] + end + + def update + @post = Post.find params[:id] + post_params = params.require(:post).permit(:title, :body) + if @post.update post_params + flash[:notice] = "Successfully updated post!" + redirect_to posts_path + else + flash[:alert] = "Post failed to create." + render :edit + end + end +end diff --git a/app/helpers/posts_helper.rb b/app/helpers/posts_helper.rb new file mode 100644 index 0000000..a7b8cec --- /dev/null +++ b/app/helpers/posts_helper.rb @@ -0,0 +1,2 @@ +module PostsHelper +end diff --git a/app/models/category.rb b/app/models/category.rb index 910a009..df2a119 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -1,2 +1,5 @@ class Category < ActiveRecord::Base + + validates_presence_of: :title + end diff --git a/app/models/comment.rb b/app/models/comment.rb index 45b2d38..aaa84bc 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -1,2 +1,8 @@ class Comment < ActiveRecord::Base + + + validates :body, presence: true, uniqueness: { scope: :post_id } + + belongs_to :post + end diff --git a/app/models/contact.rb b/app/models/contact.rb index a5ee858..1603587 100644 --- a/app/models/contact.rb +++ b/app/models/contact.rb @@ -1,2 +1,5 @@ class Contact < ActiveRecord::Base + + + end diff --git a/app/models/post.rb b/app/models/post.rb new file mode 100644 index 0000000..4e3e26b --- /dev/null +++ b/app/models/post.rb @@ -0,0 +1,6 @@ +class Post < ActiveRecord::Base + + has_many :comments, dependent: :destroy + validates :title, presence: true, uniqueness: true + +end diff --git a/app/models/title.rb b/app/models/title.rb deleted file mode 100644 index bee2c4c..0000000 --- a/app/models/title.rb +++ /dev/null @@ -1,2 +0,0 @@ -class Title < ActiveRecord::Base -end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 4191809..c5aae0d 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -1,15 +1,15 @@ - Quiz1 + Murphy's Blog <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %> <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %> <%= csrf_meta_tags %> <%= link_to "Home", root_path %> | -<%= link_to "All Requests", requests_path %> | -<%= link_to "Add a Request", new_request_path %> +<%= link_to "All Posts", posts_path %> | +<%= link_to "Add a Post", new_post_path %> <%= yield %> diff --git a/app/views/posts/_form.html.erb b/app/views/posts/_form.html.erb new file mode 100644 index 0000000..5b8c761 --- /dev/null +++ b/app/views/posts/_form.html.erb @@ -0,0 +1,19 @@ +<% if @post.errors.any? %> + +<% end %> + +<%= form_for @post do |f| %> +
+ <%= f.label :title %> + <%= f.text_field :title %> +
+
+ <%= f.label :body %> + <%= f.text_area :body %> +
+ <%= f.submit "Submit" %> +<% end %> diff --git a/app/views/posts/edit.html.erb b/app/views/posts/edit.html.erb new file mode 100644 index 0000000..fdadb73 --- /dev/null +++ b/app/views/posts/edit.html.erb @@ -0,0 +1,5 @@ +

Edit this post to suit your needs!

+ +<%= flash.alert %> + +<%= render "form" %> diff --git a/app/views/posts/index.html.erb b/app/views/posts/index.html.erb new file mode 100644 index 0000000..0ffd541 --- /dev/null +++ b/app/views/posts/index.html.erb @@ -0,0 +1,11 @@ +

All Posts

+ +<%= flash.notice %> + +<% @posts.each do |post| %> +
+

<%= link_to post.title, post_path(post) %>

+ + + +<% end %> diff --git a/app/views/posts/new.html.erb b/app/views/posts/new.html.erb new file mode 100644 index 0000000..2700c33 --- /dev/null +++ b/app/views/posts/new.html.erb @@ -0,0 +1,3 @@ +

Create a New Post!

+ +<%= render "form" %> diff --git a/app/views/posts/show.html.erb b/app/views/posts/show.html.erb new file mode 100644 index 0000000..9c29acd --- /dev/null +++ b/app/views/posts/show.html.erb @@ -0,0 +1,20 @@ + + +

<%= @post.title %>

+ +

<%= @post.body %>

+ +<%= link_to "Edit", edit_post_path(@post) %> +<%= link_to "Delete", post_path(@post), method: :delete, + data: { confirm: "Are you sure you want to delete this?" } %> + + +
+<% @post.comments.each_with_index do |comment,i| %> + +

+ Comment <%= i+1 %>: <%= comment.body %> +

+
+ +<% end %> diff --git a/config/routes.rb b/config/routes.rb index 3f66539..85f21ac 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,56 +1,7 @@ Rails.application.routes.draw do - # The priority is based upon order of creation: first created -> highest priority. - # See how all your routes lay out with "rake routes". - # You can have the root of your site routed with "root" - # root 'welcome#index' + root "home#index" + + resources :posts - # Example of regular route: - # get 'products/:id' => 'catalog#view' - - # Example of named route that can be invoked with purchase_url(id: product.id) - # get 'products/:id/purchase' => 'catalog#purchase', as: :purchase - - # Example resource route (maps HTTP verbs to controller actions automatically): - # resources :products - - # Example resource route with options: - # resources :products do - # member do - # get 'short' - # post 'toggle' - # end - # - # collection do - # get 'sold' - # end - # end - - # Example resource route with sub-resources: - # resources :products do - # resources :comments, :sales - # resource :seller - # end - - # Example resource route with more complex sub-resources: - # resources :products do - # resources :comments - # resources :sales do - # get 'recent', on: :collection - # end - # end - - # Example resource route with concerns: - # concern :toggleable do - # post 'toggle' - # end - # resources :posts, concerns: :toggleable - # resources :photos, concerns: :toggleable - - # Example resource route within a namespace: - # namespace :admin do - # # Directs /admin/products/* to Admin::ProductsController - # # (app/controllers/admin/products_controller.rb) - # resources :products - # end end diff --git a/db/.DS_Store b/db/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..94491d94c5e0ca6e7630eec8aba115a5351735bc GIT binary patch literal 6148 zcmeHK!Ab)$5S^(73toEkm|y7KLn!MP^x{$JN)=qTNPEwZ_)-0g{)O*lrsCQKPm0J4 zWZop1nPeYqk`WPI?%RdPTtsGQM5Qqz93GvTxbqaKHOGVO^#v1Hr%t13VuR8ZkQ-!+LZ;)e->6XLJ?VtR)ze9J6CF#0*3&6lkI9 zC5Bo!#*_PH$6{#VqF#KcuY4+Aw62c)sk)11!_dJ%Ffe4`!n$+b|F`&MMvMGmNc4h% zVBnuIpwnj6Eb&o(x1N0-@7jcRk4B+ip#gzCcm$xsbL6^C+I*r7zwB5HnT6vu92gIQ MN=T?+;1?Kp2kgBo0{{R3 literal 0 HcmV?d00001 diff --git a/db/migrate/20150609015548_create_titles.rb b/db/migrate/20150609015548_create_titles.rb deleted file mode 100644 index 099aa1b..0000000 --- a/db/migrate/20150609015548_create_titles.rb +++ /dev/null @@ -1,9 +0,0 @@ -class CreateTitles < ActiveRecord::Migration - def change - create_table :titles do |t| - t.text :body - - t.timestamps null: false - end - end -end diff --git a/db/migrate/20150609024027_create_posts.rb b/db/migrate/20150609024027_create_posts.rb new file mode 100644 index 0000000..691c505 --- /dev/null +++ b/db/migrate/20150609024027_create_posts.rb @@ -0,0 +1,10 @@ +class CreatePosts < ActiveRecord::Migration + def change + create_table :posts do |t| + t.string :title + t.text :body + + t.timestamps null: false + end + end +end diff --git a/db/schema.rb b/db/schema.rb index a5043cb..ebf8500 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: 20150609015835) do +ActiveRecord::Schema.define(version: 20150609233706) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -26,8 +26,11 @@ t.text "body" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.integer "post_id" end + add_index "comments", ["post_id"], name: "index_comments_on_post_id", using: :btree + create_table "contacts", force: :cascade do |t| t.string "email" t.string "name" @@ -37,10 +40,18 @@ t.datetime "updated_at", null: false end + create_table "posts", force: :cascade do |t| + t.string "title" + t.text "body" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + create_table "titles", force: :cascade do |t| t.text "body" t.datetime "created_at", null: false t.datetime "updated_at", null: false end + add_foreign_key "comments", "posts" end diff --git a/test/controllers/posts_controller_test.rb b/test/controllers/posts_controller_test.rb new file mode 100644 index 0000000..7a6ee4f --- /dev/null +++ b/test/controllers/posts_controller_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class PostsControllerTest < ActionController::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/fixtures/titles.yml b/test/fixtures/posts.yml similarity index 78% rename from test/fixtures/titles.yml rename to test/fixtures/posts.yml index e46420e..e192dee 100644 --- a/test/fixtures/titles.yml +++ b/test/fixtures/posts.yml @@ -1,7 +1,9 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html one: + title: MyString body: MyText two: + title: MyString body: MyText diff --git a/test/models/title_test.rb b/test/models/post_test.rb similarity index 64% rename from test/models/title_test.rb rename to test/models/post_test.rb index 954b9e3..6d9d463 100644 --- a/test/models/title_test.rb +++ b/test/models/post_test.rb @@ -1,6 +1,6 @@ require 'test_helper' -class TitleTest < ActiveSupport::TestCase +class PostTest < ActiveSupport::TestCase # test "the truth" do # assert true # end From 801004a7b28f2b565bb55bdb0cd45353e11654e4 Mon Sep 17 00:00:00 2001 From: Murphy Stroppa Date: Wed, 10 Jun 2015 09:44:21 -0700 Subject: [PATCH 02/12] Pushing to keep my git streak alive --- .DS_Store | Bin 6148 -> 0 bytes app/assets/javascripts/comments.coffee | 3 +++ app/assets/stylesheets/comments.scss | 3 +++ app/controllers/comments_controller.rb | 16 ++++++++++++++ app/controllers/posts_controller.rb | 1 + app/helpers/comments_helper.rb | 2 ++ app/views/layouts/application.html.erb | 1 + app/views/posts/show.html.erb | 21 +++++++++++++++++-- config/routes.rb | 5 ++++- test/controllers/comments_controller_test.rb | 7 +++++++ 10 files changed, 56 insertions(+), 3 deletions(-) delete mode 100644 .DS_Store create mode 100644 app/assets/javascripts/comments.coffee create mode 100644 app/assets/stylesheets/comments.scss create mode 100644 app/controllers/comments_controller.rb create mode 100644 app/helpers/comments_helper.rb create mode 100644 test/controllers/comments_controller_test.rb diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 238215e71e9e208266f164b392de324db03cf02c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK!AiqG5Ph4JQW2#m(ObZ~(6b&wiTD9M3u;2EU`!6_eg8xK48Os%AL7xwGrQ9? z+q72|nSt52nVGkfyg)V!z)Y9L1Q-JtkuyenG;A@>v-d2L$RVNOH72vXD(haI2L7%B z{O)4hqDK9==)S+BlXa%7vaDD(Iq>oPb>JRGIAvAr$kg|p)r@7*5IHJ5VU7nZ!fxm9 zoB1t0BNVs`d8ePmbMa37>%}#FBVL z3Hl6EN76wRPz6+hUsizjY_`$9M;%oGRX`PJ72xkfLe7{9T95A2L4!L25DqBpjOKin zU``^K3R;hpAv2yz=&44I7{=2no=9CPXgzv5j2u3UbT)EAF|IqUpSW_E)T557fGQ9w z5c|t9@Bf#(&;KDwuT%k5;9n_V2H7l|(j&><+Iu+OYZLMtayG8B9$N}c+*VArycHjl aJEM5Q6T(!`dZY-M{s=f3bWjC;RDo|;fL@jW diff --git a/app/assets/javascripts/comments.coffee b/app/assets/javascripts/comments.coffee new file mode 100644 index 0000000..24f83d1 --- /dev/null +++ b/app/assets/javascripts/comments.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/comments.scss b/app/assets/stylesheets/comments.scss new file mode 100644 index 0000000..3722c12 --- /dev/null +++ b/app/assets/stylesheets/comments.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the comments 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/comments_controller.rb b/app/controllers/comments_controller.rb new file mode 100644 index 0000000..9ed2080 --- /dev/null +++ b/app/controllers/comments_controller.rb @@ -0,0 +1,16 @@ +class CommentsController < ApplicationController + + def create + comment_params = params.require(:comment).permit(:body) + @post = Post.find(params[:post_id]) + @comment = Comment.new comment_params + @comment.post_id = params[:post_id] + if @comment.save + redirect_to post_path(@post) + else + flash[:alert] = "Something went wrong!" + render "/posts/show" + end + end + +end diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb index 5dde437..a16ce82 100644 --- a/app/controllers/posts_controller.rb +++ b/app/controllers/posts_controller.rb @@ -21,6 +21,7 @@ def create def show @post = Post.find params[:id] + @comment = Comment.new end def destroy diff --git a/app/helpers/comments_helper.rb b/app/helpers/comments_helper.rb new file mode 100644 index 0000000..0ec9ca5 --- /dev/null +++ b/app/helpers/comments_helper.rb @@ -0,0 +1,2 @@ +module CommentsHelper +end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index c5aae0d..9378ffa 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -8,6 +8,7 @@ <%= link_to "Home", root_path %> | +<%= link_to "About Me", home_about_path %> | <%= link_to "All Posts", posts_path %> | <%= link_to "Add a Post", new_post_path %> <%= yield %> diff --git a/app/views/posts/show.html.erb b/app/views/posts/show.html.erb index 9c29acd..20b2835 100644 --- a/app/views/posts/show.html.erb +++ b/app/views/posts/show.html.erb @@ -7,8 +7,16 @@ <%= link_to "Edit", edit_post_path(@post) %> <%= link_to "Delete", post_path(@post), method: :delete, data: { confirm: "Are you sure you want to delete this?" } %> - - +<% if flash[:alert] %> +


+ <%= flash[:alert] %> + <% if @comment.errors.any? %> + <% @comment.errors.full_messages.each do |msg| %> + <%= msg %> + <% end %> + <% end %> +


+<% end %>
<% @post.comments.each_with_index do |comment,i| %> @@ -18,3 +26,12 @@
<% end %> + +<%= form_for [@post, @comment] do |f| %> +
+ <%= f.label :body %> + <%= f.text_area :body %> +
+ <%= f.submit %> + +<% end %> diff --git a/config/routes.rb b/config/routes.rb index 85f21ac..cecc717 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,7 +1,10 @@ Rails.application.routes.draw do root "home#index" + get "/home/about" => "home#about" - resources :posts + resources :posts do + resources :comments + end end diff --git a/test/controllers/comments_controller_test.rb b/test/controllers/comments_controller_test.rb new file mode 100644 index 0000000..2ec71b4 --- /dev/null +++ b/test/controllers/comments_controller_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class CommentsControllerTest < ActionController::TestCase + # test "the truth" do + # assert true + # end +end From a37b1252095f40a1e6502c0a122a47c873eaa529 Mon Sep 17 00:00:00 2001 From: Murphy Stroppa Date: Wed, 10 Jun 2015 17:22:04 -0700 Subject: [PATCH 03/12] Added ability to edit and delete comments --- app/controllers/comments_controller.rb | 24 ++++++++++++++++++++++++ app/views/posts/show.html.erb | 5 +++++ 2 files changed, 29 insertions(+) diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb index 9ed2080..5e8c3fd 100644 --- a/app/controllers/comments_controller.rb +++ b/app/controllers/comments_controller.rb @@ -13,4 +13,28 @@ def create end end + def edit + @comment = Comment.find params[:id] + @post = Post.find params[:post_id] + end + + def update + @post = Post.find params[:post_id] + comment_params = params.require(:comment).permit(:body) + @comment = Comment.find params[:id] + if @comment.update comment_params + redirect_to post_path(@post) + else + render :edit, notice: "Failed to update." + end + end + + def destroy + post = Post.find params[:post_id] + comment = Comment.find params[:id] + comment.destroy + flash[:notice] = "Comment successfully deleted \n\n" + redirect_to post + end + end diff --git a/app/views/posts/show.html.erb b/app/views/posts/show.html.erb index 20b2835..de253b0 100644 --- a/app/views/posts/show.html.erb +++ b/app/views/posts/show.html.erb @@ -22,11 +22,16 @@

Comment <%= i+1 %>: <%= comment.body %> + <%= link_to "Edit", edit_post_comment_path(@post,comment) %> + <%= link_to "Delete", post_comment_path(@post, comment), method: :delete, + data: {confirm: "Delete comment?"}%>


<% end %> +<%= flash[:notice] if flash[:notice] %> + <%= form_for [@post, @comment] do |f| %>
<%= f.label :body %> From ab2ffb8b0787064bab6b705ceeea355d96569c97 Mon Sep 17 00:00:00 2001 From: Murphy Stroppa Date: Sat, 13 Jun 2015 11:13:44 -0700 Subject: [PATCH 04/12] Added sorting of comments showing the newest first on posts --- app/controllers/posts_controller.rb | 3 ++- app/models/comment.rb | 4 ++++ app/views/comments/edit.html.erb | 11 +++++++++++ app/views/posts/show.html.erb | 3 ++- 4 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 app/views/comments/edit.html.erb diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb index a16ce82..263d825 100644 --- a/app/controllers/posts_controller.rb +++ b/app/controllers/posts_controller.rb @@ -21,7 +21,8 @@ def create def show @post = Post.find params[:id] - @comment = Comment.new + @comment = Comment.new + @comments = Comment.search(@post.id) end def destroy diff --git a/app/models/comment.rb b/app/models/comment.rb index aaa84bc..f25f42b 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -5,4 +5,8 @@ class Comment < ActiveRecord::Base belongs_to :post + def self.search id + Comment.where("post_id = #{id}").order("created_at desc") + end + end diff --git a/app/views/comments/edit.html.erb b/app/views/comments/edit.html.erb new file mode 100644 index 0000000..6d9f8f0 --- /dev/null +++ b/app/views/comments/edit.html.erb @@ -0,0 +1,11 @@ +

Edit the Comment

+ + + +<%= form_for [@post, @comment] do |f| %> +
+ <%= f.label :body %> + <%= f.text_area :body %> +
+ <%= f.submit %> +<% end %> diff --git a/app/views/posts/show.html.erb b/app/views/posts/show.html.erb index de253b0..c4847ee 100644 --- a/app/views/posts/show.html.erb +++ b/app/views/posts/show.html.erb @@ -18,7 +18,8 @@


<% end %>
-<% @post.comments.each_with_index do |comment,i| %> +<%# @post.comments.sort_by {|comment| comment.id }.reverse.each_with_index do |comment,i| %> +<% @comments.each_with_index do |comment,i| %>

Comment <%= i+1 %>: <%= comment.body %> From 246307b83cb26f906e505dda227165ea0c1608bf Mon Sep 17 00:00:00 2001 From: Murphy Stroppa Date: Mon, 15 Jun 2015 18:01:53 -0700 Subject: [PATCH 05/12] Added users, authentication, and sessions --- .DS_Store | Bin 0 -> 6148 bytes Gemfile | 2 +- Gemfile.lock | 2 + app/assets/javascripts/sessions.coffee | 3 ++ app/assets/javascripts/users.coffee | 3 ++ app/assets/stylesheets/sessions.scss | 3 ++ app/assets/stylesheets/users.scss | 3 ++ app/controllers/application_controller.rb | 17 +++++++ app/controllers/comments_controller.rb | 2 + app/controllers/posts_controller.rb | 2 + app/controllers/sessions_controller.rb | 22 +++++++++ app/controllers/users_controller.rb | 39 ++++++++++++++++ app/helpers/sessions_helper.rb | 2 + app/helpers/users_helper.rb | 2 + app/models/category.rb | 1 + app/models/comment.rb | 3 +- app/models/post.rb | 1 + app/models/post_file.rb | 3 ++ app/models/user.rb | 12 +++++ app/views/layouts/application.html.erb | 17 ++++++- app/views/sessions/new.html.erb | 15 ++++++ app/views/users/_form.html.erb | 43 ++++++++++++++++++ app/views/users/edit.html.erb | 3 ++ app/views/users/new.html.erb | 3 ++ config/routes.rb | 11 ++++- db/.DS_Store | Bin 6148 -> 6148 bytes db/migrate/20150614212959_create_users.rb | 12 +++++ ...50614213024_add_user_reference_to_posts.rb | 5 ++ ...14213039_add_user_reference_to_comments.rb | 5 ++ .../20150614214423_create_post_files.rb | 11 +++++ db/schema.rb | 29 +++++++++++- test/controllers/sessions_controller_test.rb | 7 +++ test/controllers/users_controller_test.rb | 7 +++ test/fixtures/post_files.yml | 11 +++++ test/fixtures/users.yml | 13 ++++++ test/models/post_file_test.rb | 7 +++ test/models/user_test.rb | 7 +++ 37 files changed, 323 insertions(+), 5 deletions(-) create mode 100644 .DS_Store create mode 100644 app/assets/javascripts/sessions.coffee create mode 100644 app/assets/javascripts/users.coffee create mode 100644 app/assets/stylesheets/sessions.scss create mode 100644 app/assets/stylesheets/users.scss create mode 100644 app/controllers/sessions_controller.rb create mode 100644 app/controllers/users_controller.rb create mode 100644 app/helpers/sessions_helper.rb create mode 100644 app/helpers/users_helper.rb create mode 100644 app/models/post_file.rb create mode 100644 app/models/user.rb create mode 100644 app/views/sessions/new.html.erb create mode 100644 app/views/users/_form.html.erb create mode 100644 app/views/users/edit.html.erb create mode 100644 app/views/users/new.html.erb create mode 100644 db/migrate/20150614212959_create_users.rb create mode 100644 db/migrate/20150614213024_add_user_reference_to_posts.rb create mode 100644 db/migrate/20150614213039_add_user_reference_to_comments.rb create mode 100644 db/migrate/20150614214423_create_post_files.rb create mode 100644 test/controllers/sessions_controller_test.rb create mode 100644 test/controllers/users_controller_test.rb create mode 100644 test/fixtures/post_files.yml create mode 100644 test/fixtures/users.yml create mode 100644 test/models/post_file_test.rb create mode 100644 test/models/user_test.rb diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..9b0b0ede2117b317ca7ad6b31fe7b14b6a8b57fb GIT binary patch literal 6148 zcmeHKu};G<6g)Qpg;J!Bh$#{aVnFJ`)FG;h_<$}fNQDLps38%w8$-mv%wAad2X-WW z0RDspX5O>i)=t~05<-=qWS{$(*MGG|8rBx`cDUIq)AH;CI)@9=fCy0%)qQmoI=EFs3J z&D*^vp3EEbpX zsHcTseW9y3vU9*Wu#67y_aUUl7-`HE%1;M%@(4iaQ(6X%t2`hKHAWh9g;b#sib|-c zLLV`NqEkN9^CFG8LPdwrhYz8Zg+8GOsZQ4q<#dQhq3fLk&H>v2PyMX&{(mt4{BM)o zFXw=BV5uAsezVnV(314tI<+|7YeQ;nY8*T-S12je>Frn!cq`tdCWC4r4+tZTxkAcN PxIY5Y2G= 2.0' gem 'sdoc', '~> 0.4.0', group: :doc # Use ActiveModel has_secure_password -# gem 'bcrypt', '~> 3.1.7' +gem 'bcrypt', '~> 3.1.7' # Use Unicorn as the app server # gem 'unicorn' diff --git a/Gemfile.lock b/Gemfile.lock index 50157f9..ceaa59c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -38,6 +38,7 @@ GEM tzinfo (~> 1.1) arel (6.0.0) awesome_print (1.6.1) + bcrypt (3.1.10) binding_of_caller (0.7.2) debug_inspector (>= 0.0.1) builder (3.2.2) @@ -149,6 +150,7 @@ PLATFORMS DEPENDENCIES awesome_print + bcrypt (~> 3.1.7) byebug coffee-rails (~> 4.1.0) hirb diff --git a/app/assets/javascripts/sessions.coffee b/app/assets/javascripts/sessions.coffee new file mode 100644 index 0000000..24f83d1 --- /dev/null +++ b/app/assets/javascripts/sessions.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/users.coffee b/app/assets/javascripts/users.coffee new file mode 100644 index 0000000..24f83d1 --- /dev/null +++ b/app/assets/javascripts/users.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/sessions.scss b/app/assets/stylesheets/sessions.scss new file mode 100644 index 0000000..7bef9cf --- /dev/null +++ b/app/assets/stylesheets/sessions.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the sessions 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/users.scss b/app/assets/stylesheets/users.scss new file mode 100644 index 0000000..1efc835 --- /dev/null +++ b/app/assets/stylesheets/users.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the users 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/application_controller.rb b/app/controllers/application_controller.rb index d83690e..d8ab139 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -2,4 +2,21 @@ class ApplicationController < ActionController::Base # Prevent CSRF attacks by raising an exception. # For APIs, you may want to use :null_session instead. protect_from_forgery with: :exception + + def authenticate_user! + redirect_to new_session_path, notice: "Please sign in" unless user_signed_in? + end + + def user_signed_in? + current_user.present? + end + + helper_method :user_signed_in? + + def current_user + @current_user ||= User.find_by_id(session[:user_id]) + end + + helper_method :current_user + end diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb index 5e8c3fd..4831dfc 100644 --- a/app/controllers/comments_controller.rb +++ b/app/controllers/comments_controller.rb @@ -1,5 +1,7 @@ class CommentsController < ApplicationController + before_action :authenticate_user! + def create comment_params = params.require(:comment).permit(:body) @post = Post.find(params[:post_id]) diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb index 263d825..84f2a76 100644 --- a/app/controllers/posts_controller.rb +++ b/app/controllers/posts_controller.rb @@ -1,5 +1,7 @@ class PostsController < ApplicationController + before_action :authenticate_user!, except: [:index, :show] + def index @posts = Post.all end diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb new file mode 100644 index 0000000..7976855 --- /dev/null +++ b/app/controllers/sessions_controller.rb @@ -0,0 +1,22 @@ +class SessionsController < ApplicationController + + def new + end + + def create + @user = User.find_by_email params[:email] + if @user && @user.authenticate(params[:password]) + session[:user_id] = @user.id + redirect_to root_path, notice: "Logged in" + else + flash[:alert] = "Wrong email or password" + render :new + end + end + + def destroy + session[:user_id] = nil + redirect_to root_path, notice: "Logged out" + end + +end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb new file mode 100644 index 0000000..e4ccd3b --- /dev/null +++ b/app/controllers/users_controller.rb @@ -0,0 +1,39 @@ +class UsersController < ApplicationController + + before_action :authenticate_user!, only: [:update] + + def new + @user = User.new + end + + def create + user_params = params.require(:user).permit(:first_name, :last_name, :email, + :password, :password_confirmation) + @user = User.new user_params + if @user.save + session[:user_id] = @user.id + redirect_to root_path, notice: "Logged In!" + else + render :new + end + end + + def edit + @user = current_user + end + + def update + user_params = params.require(:user).permit(:first_name, :last_name, :email, + :password, :password_confirmation) + @user = current_user + if !@user.authenticate(params[:user][:current_password]) + flash[:alert] = "You've entered the wrong password" + render :edit + elsif @user.update(user_params) + redirect_to edit_users_path, notice: "Information updated" + else + render :edit + end + end + +end diff --git a/app/helpers/sessions_helper.rb b/app/helpers/sessions_helper.rb new file mode 100644 index 0000000..309f8b2 --- /dev/null +++ b/app/helpers/sessions_helper.rb @@ -0,0 +1,2 @@ +module SessionsHelper +end diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb new file mode 100644 index 0000000..2310a24 --- /dev/null +++ b/app/helpers/users_helper.rb @@ -0,0 +1,2 @@ +module UsersHelper +end diff --git a/app/models/category.rb b/app/models/category.rb index df2a119..8cdad73 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -1,5 +1,6 @@ class Category < ActiveRecord::Base + has_many :posts, dependent: :nullify validates_presence_of: :title end diff --git a/app/models/comment.rb b/app/models/comment.rb index f25f42b..b232ac0 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -4,7 +4,8 @@ class Comment < ActiveRecord::Base validates :body, presence: true, uniqueness: { scope: :post_id } belongs_to :post - + belongs_to :user + def self.search id Comment.where("post_id = #{id}").order("created_at desc") end diff --git a/app/models/post.rb b/app/models/post.rb index 4e3e26b..ef5e998 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -1,5 +1,6 @@ class Post < ActiveRecord::Base + belongs_to :category has_many :comments, dependent: :destroy validates :title, presence: true, uniqueness: true diff --git a/app/models/post_file.rb b/app/models/post_file.rb new file mode 100644 index 0000000..1740810 --- /dev/null +++ b/app/models/post_file.rb @@ -0,0 +1,3 @@ +class PostFile < ActiveRecord::Base + belongs_to :post +end diff --git a/app/models/user.rb b/app/models/user.rb new file mode 100644 index 0000000..de0f88e --- /dev/null +++ b/app/models/user.rb @@ -0,0 +1,12 @@ +class User < ActiveRecord::Base + + has_many :posts, dependent: :destroy + has_many :comments, dependent: :destroy + has_secure_password + validates :email, presence: :true, uniqueness: true, + format: /\A([\w+\-].?)+@[a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/i + + def full_name + "#{first_name} #{last_name}".strip.squeeze(" ") + end +end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 9378ffa..52313a3 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -10,7 +10,22 @@ <%= link_to "Home", root_path %> | <%= link_to "About Me", home_about_path %> | <%= link_to "All Posts", posts_path %> | -<%= link_to "Add a Post", new_post_path %> +<%= link_to "Add a Post", new_post_path %> | + +<% unless user_signed_in? %> + <%= link_to "Sign up", new_user_path %> | + <%= link_to "Login", new_session_path %> +<% end %> +<% if user_signed_in? %> + <%= link_to "Edit Profile", edit_users_path %> | + <%= link_to "Logout", sessions_path, method: :delete %> +<% end %> +<% if flash[:alert] %> +

<%= flash[:alert] %>
+<% end %> +<% if flash[:notice] %> +

<%= flash[:notice] %>
+<% end %> <%= yield %> diff --git a/app/views/sessions/new.html.erb b/app/views/sessions/new.html.erb new file mode 100644 index 0000000..bd48717 --- /dev/null +++ b/app/views/sessions/new.html.erb @@ -0,0 +1,15 @@ +

Sign in!

+ +<%= form_tag sessions_path do %> + +
+ <%= label_tag :email %> + <%= text_field_tag :email %> +
+
+ <%= label_tag :password %> + <%= password_field_tag :password %> +
+ <%= submit_tag %> + +<% end %> diff --git a/app/views/users/_form.html.erb b/app/views/users/_form.html.erb new file mode 100644 index 0000000..457fca2 --- /dev/null +++ b/app/views/users/_form.html.erb @@ -0,0 +1,43 @@ +<% if @user.errors.any? %> +
    + <% @user.errors.full_messages.each do |msg| %> +
  • +

    <%= msg %>

    +
  • + <% end %> +
+<% end %> + + +<%= form_for @user, url: users_path do |f| %> + +
+ <%= f.label :first_name %> + <%= f.text_field :first_name %> +
+
+ <%= f.label :last_name %> + <%= f.text_field :last_name %> +
+
+ <%= f.label :email %> + <%= f.email_field :email %> +
+ <% if @user.persisted? %> +
+

Please enter your current password to implement changes

+ <%= f.label :current_password %> + <%= f.password_field :current_password %> +
+ <% end %> +
+ <%= f.label :password %> + <%= f.password_field :password %> +
+
+ <%= f.label :password_confirmation %> + <%= f.password_field :password_confirmation %> +
+ + <%= f.submit %> +<% end %> diff --git a/app/views/users/edit.html.erb b/app/views/users/edit.html.erb new file mode 100644 index 0000000..e7cae8c --- /dev/null +++ b/app/views/users/edit.html.erb @@ -0,0 +1,3 @@ +

Change your profile

+ +<%= render "form" %> diff --git a/app/views/users/new.html.erb b/app/views/users/new.html.erb new file mode 100644 index 0000000..f07da2d --- /dev/null +++ b/app/views/users/new.html.erb @@ -0,0 +1,3 @@ +

Create a new User

+ +<%= render "form" %> diff --git a/config/routes.rb b/config/routes.rb index cecc717..d69d782 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -2,7 +2,16 @@ root "home#index" get "/home/about" => "home#about" - + + resources :users, only: [:new, :create] do + get :edit, on: :collection + patch :update, on: :collection + end + + resources :sessions, only: [:new, :create] do + delete :destroy, on: :collection + end + resources :posts do resources :comments end diff --git a/db/.DS_Store b/db/.DS_Store index 94491d94c5e0ca6e7630eec8aba115a5351735bc..fce560530b9728da0530f6daf9cfaede423d0f5d 100644 GIT binary patch delta 65 zcmZoMXffEJ!^p(?cX9xu2#&heKY0Ke81$^ZZW delta 65 zcmZoMXffEJ!^p(+a&iEp2# Date: Thu, 18 Jun 2015 18:29:43 -0700 Subject: [PATCH 06/12] Added ability for users to favourite posts and view a list of their favourited posts --- app/assets/javascripts/favourites.coffee | 3 ++ app/assets/stylesheets/favourites.scss | 3 ++ app/controllers/favourites_controller.rb | 28 +++++++++++++++++++ app/controllers/posts_controller.rb | 1 + app/helpers/favourites_helper.rb | 2 ++ app/models/comment.rb | 2 +- app/models/favourite.rb | 6 ++++ app/models/post.rb | 11 ++++++++ app/models/user.rb | 3 ++ app/views/favourites/index.html.erb | 8 ++++++ app/views/layouts/application.html.erb | 6 +++- app/views/posts/show.html.erb | 15 +++++++--- config/routes.rb | 2 ++ .../20150619002353_create_favourites.rb | 10 +++++++ db/schema.rb | 14 +++++++++- .../controllers/favourites_controller_test.rb | 7 +++++ test/fixtures/favourites.yml | 9 ++++++ test/models/favourite_test.rb | 7 +++++ 18 files changed, 130 insertions(+), 7 deletions(-) create mode 100644 app/assets/javascripts/favourites.coffee create mode 100644 app/assets/stylesheets/favourites.scss create mode 100644 app/controllers/favourites_controller.rb create mode 100644 app/helpers/favourites_helper.rb create mode 100644 app/models/favourite.rb create mode 100644 app/views/favourites/index.html.erb create mode 100644 db/migrate/20150619002353_create_favourites.rb create mode 100644 test/controllers/favourites_controller_test.rb create mode 100644 test/fixtures/favourites.yml create mode 100644 test/models/favourite_test.rb diff --git a/app/assets/javascripts/favourites.coffee b/app/assets/javascripts/favourites.coffee new file mode 100644 index 0000000..24f83d1 --- /dev/null +++ b/app/assets/javascripts/favourites.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/favourites.scss b/app/assets/stylesheets/favourites.scss new file mode 100644 index 0000000..66cc292 --- /dev/null +++ b/app/assets/stylesheets/favourites.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the favourites 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/favourites_controller.rb b/app/controllers/favourites_controller.rb new file mode 100644 index 0000000..75964a2 --- /dev/null +++ b/app/controllers/favourites_controller.rb @@ -0,0 +1,28 @@ +class FavouritesController < ApplicationController + + + before_action :authenticate_user! + + def create + post = Post.find params[:post_id] + favourite = post.favourites.new + favourite.user = current_user + if favourite.save + redirect_to post, notice: "Post favourited" + else + redirect_to post, alert: "Error!" + end + end + + def destroy + post = Post.find params[:post_id] + favourite = current_user.favourites.find_by_post_id(post) + favourite.destroy + redirect_to post, notice: "Un-favourited" + end + + def index + @favourites = current_user.favourites + end + +end diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb index 84f2a76..c3f6d9f 100644 --- a/app/controllers/posts_controller.rb +++ b/app/controllers/posts_controller.rb @@ -25,6 +25,7 @@ def show @post = Post.find params[:id] @comment = Comment.new @comments = Comment.search(@post.id) + @favourite = @post.favourite_for(current_user) end def destroy diff --git a/app/helpers/favourites_helper.rb b/app/helpers/favourites_helper.rb new file mode 100644 index 0000000..907962e --- /dev/null +++ b/app/helpers/favourites_helper.rb @@ -0,0 +1,2 @@ +module FavouritesHelper +end diff --git a/app/models/comment.rb b/app/models/comment.rb index b232ac0..b5a8192 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -5,7 +5,7 @@ class Comment < ActiveRecord::Base belongs_to :post belongs_to :user - + def self.search id Comment.where("post_id = #{id}").order("created_at desc") end diff --git a/app/models/favourite.rb b/app/models/favourite.rb new file mode 100644 index 0000000..2ce9cc0 --- /dev/null +++ b/app/models/favourite.rb @@ -0,0 +1,6 @@ +class Favourite < ActiveRecord::Base + belongs_to :user + belongs_to :post + + validates :user_id, uniqueness: {scope: :post_id} +end diff --git a/app/models/post.rb b/app/models/post.rb index ef5e998..5c6194b 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -1,7 +1,18 @@ class Post < ActiveRecord::Base + has_many :favourites, dependent: :destroy + has_many :favouriting_users, through: :favourites, source: :user + + belongs_to :user belongs_to :category has_many :comments, dependent: :destroy validates :title, presence: true, uniqueness: true + def favourited_by?(user) + favourites.where(user: user).present? + end + + def favourite_for(user) + favourites.find_by_user_id(user) + end end diff --git a/app/models/user.rb b/app/models/user.rb index de0f88e..b32fcc1 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,5 +1,8 @@ class User < ActiveRecord::Base + has_many :favourites, dependent: :destroy + has_many :favourited_posts, through: :favourites, source: :post + has_many :posts, dependent: :destroy has_many :comments, dependent: :destroy has_secure_password diff --git a/app/views/favourites/index.html.erb b/app/views/favourites/index.html.erb new file mode 100644 index 0000000..90f7863 --- /dev/null +++ b/app/views/favourites/index.html.erb @@ -0,0 +1,8 @@ +

Your Favourite Posts

+ + +<% @favourites.each do |favourite| %> + +

<%= link_to "#{favourite.post.title}", favourite.post %>

+ +<% end %> diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 52313a3..6d7dfd5 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -15,10 +15,14 @@ <% unless user_signed_in? %> <%= link_to "Sign up", new_user_path %> | <%= link_to "Login", new_session_path %> + <% end %> <% if user_signed_in? %> <%= link_to "Edit Profile", edit_users_path %> | - <%= link_to "Logout", sessions_path, method: :delete %> + <%= link_to "Logout", sessions_path, method: :delete %> | + Hi there <%= current_user.full_name %>, here are your + <%= link_to 'Favourite Posts', user_favourites_path(current_user) %> + <% end %> <% if flash[:alert] %>

<%= flash[:alert] %>
diff --git a/app/views/posts/show.html.erb b/app/views/posts/show.html.erb index c4847ee..6a6f7ae 100644 --- a/app/views/posts/show.html.erb +++ b/app/views/posts/show.html.erb @@ -3,10 +3,17 @@

<%= @post.title %>

<%= @post.body %>

- -<%= link_to "Edit", edit_post_path(@post) %> -<%= link_to "Delete", post_path(@post), method: :delete, - data: { confirm: "Are you sure you want to delete this?" } %> +<% if current_user.present? %> + <% if @post.favourited_by?(current_user) %> + <%= link_to "Un-Favourite", post_favourite_path(@post, @favourite), + method: :delete %> + <% else %> + <%= link_to "Favourite", post_favourites_path(@post), method: :post %> + <% end %> + <%= link_to "Edit", edit_post_path(@post) %> + <%= link_to "Delete", post_path(@post), method: :delete, + data: { confirm: "Are you sure you want to delete this?" } %> +<% end %> <% if flash[:alert] %>


<%= flash[:alert] %> diff --git a/config/routes.rb b/config/routes.rb index d69d782..0f21916 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -4,6 +4,7 @@ get "/home/about" => "home#about" resources :users, only: [:new, :create] do + resources :favourites, only: [:index] get :edit, on: :collection patch :update, on: :collection end @@ -13,6 +14,7 @@ end resources :posts do + resources :favourites, only: [:destroy, :create] resources :comments end diff --git a/db/migrate/20150619002353_create_favourites.rb b/db/migrate/20150619002353_create_favourites.rb new file mode 100644 index 0000000..bf98360 --- /dev/null +++ b/db/migrate/20150619002353_create_favourites.rb @@ -0,0 +1,10 @@ +class CreateFavourites < ActiveRecord::Migration + def change + create_table :favourites do |t| + t.references :user, index: true, foreign_key: true + t.references :post, index: true, foreign_key: true + + t.timestamps null: false + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 47be2d8..dd4bae9 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: 20150614214423) do +ActiveRecord::Schema.define(version: 20150619002353) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -42,6 +42,16 @@ t.datetime "updated_at", null: false end + create_table "favourites", force: :cascade do |t| + t.integer "user_id" + t.integer "post_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + add_index "favourites", ["post_id"], name: "index_favourites_on_post_id", using: :btree + add_index "favourites", ["user_id"], name: "index_favourites_on_user_id", using: :btree + create_table "post_files", force: :cascade do |t| t.string "name" t.text "description" @@ -79,6 +89,8 @@ add_foreign_key "comments", "posts" add_foreign_key "comments", "users" + add_foreign_key "favourites", "posts" + add_foreign_key "favourites", "users" add_foreign_key "post_files", "posts" add_foreign_key "posts", "users" end diff --git a/test/controllers/favourites_controller_test.rb b/test/controllers/favourites_controller_test.rb new file mode 100644 index 0000000..31785f5 --- /dev/null +++ b/test/controllers/favourites_controller_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class FavouritesControllerTest < ActionController::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/fixtures/favourites.yml b/test/fixtures/favourites.yml new file mode 100644 index 0000000..a5aae8c --- /dev/null +++ b/test/fixtures/favourites.yml @@ -0,0 +1,9 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + user_id: + post_id: + +two: + user_id: + post_id: diff --git a/test/models/favourite_test.rb b/test/models/favourite_test.rb new file mode 100644 index 0000000..8bbf41d --- /dev/null +++ b/test/models/favourite_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class FavouriteTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end From 46b6688016841c6c7eb8a4d4585b3c92de41b9b7 Mon Sep 17 00:00:00 2001 From: Murphy Stroppa Date: Fri, 19 Jun 2015 08:34:31 -0700 Subject: [PATCH 07/12] Tagging added to posts --- app/controllers/comments_controller.rb | 1 + app/controllers/posts_controller.rb | 5 +++-- app/models/category.rb | 3 ++- app/models/post.rb | 4 ++++ app/models/tag.rb | 8 ++++++++ app/models/tagging.rb | 6 ++++++ app/views/layouts/application.html.erb | 2 +- app/views/posts/_form.html.erb | 4 ++++ app/views/posts/new.html.erb | 2 ++ app/views/posts/show.html.erb | 5 +++-- db/migrate/20150619014257_create_tags.rb | 9 +++++++++ db/migrate/20150619014310_create_taggings.rb | 10 ++++++++++ db/schema.rb | 20 +++++++++++++++++++- db/seeds.rb | 4 ++++ test/fixtures/taggings.yml | 9 +++++++++ test/fixtures/tags.yml | 7 +++++++ test/models/tag_test.rb | 7 +++++++ test/models/tagging_test.rb | 7 +++++++ 18 files changed, 106 insertions(+), 7 deletions(-) create mode 100644 app/models/tag.rb create mode 100644 app/models/tagging.rb create mode 100644 db/migrate/20150619014257_create_tags.rb create mode 100644 db/migrate/20150619014310_create_taggings.rb create mode 100644 test/fixtures/taggings.yml create mode 100644 test/fixtures/tags.yml create mode 100644 test/models/tag_test.rb create mode 100644 test/models/tagging_test.rb diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb index 4831dfc..13dea59 100644 --- a/app/controllers/comments_controller.rb +++ b/app/controllers/comments_controller.rb @@ -7,6 +7,7 @@ def create @post = Post.find(params[:post_id]) @comment = Comment.new comment_params @comment.post_id = params[:post_id] + @comment.user = current_user if @comment.save redirect_to post_path(@post) else diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb index c3f6d9f..f8825fa 100644 --- a/app/controllers/posts_controller.rb +++ b/app/controllers/posts_controller.rb @@ -11,8 +11,9 @@ def new end def create - post_params = params.require(:post).permit(:title, :body) + post_params = params.require(:post).permit(:title, :body, {tag_ids: []}) @post = Post.new post_params + @post.user = current_user if @post.save redirect_to posts_path else @@ -41,7 +42,7 @@ def edit def update @post = Post.find params[:id] - post_params = params.require(:post).permit(:title, :body) + post_params = params.require(:post).permit(:title, :body, {tag_ids: []}) if @post.update post_params flash[:notice] = "Successfully updated post!" redirect_to posts_path diff --git a/app/models/category.rb b/app/models/category.rb index 8cdad73..0d71b56 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -1,6 +1,7 @@ class Category < ActiveRecord::Base has_many :posts, dependent: :nullify - validates_presence_of: :title + + validates :title, presence: true end diff --git a/app/models/post.rb b/app/models/post.rb index 5c6194b..354b4e0 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -1,5 +1,9 @@ class Post < ActiveRecord::Base + has_many :taggings, dependent: :destroy + has_many :tags, through: :taggings + + has_many :favourites, dependent: :destroy has_many :favouriting_users, through: :favourites, source: :user diff --git a/app/models/tag.rb b/app/models/tag.rb new file mode 100644 index 0000000..b9bd168 --- /dev/null +++ b/app/models/tag.rb @@ -0,0 +1,8 @@ +class Tag < ActiveRecord::Base + + has_many :taggings, dependent: :destroy + has_many :posts, through: :taggings + + validates :name, uniqueness: true + +end diff --git a/app/models/tagging.rb b/app/models/tagging.rb new file mode 100644 index 0000000..1c1cbfd --- /dev/null +++ b/app/models/tagging.rb @@ -0,0 +1,6 @@ +class Tagging < ActiveRecord::Base + belongs_to :tag + belongs_to :post + + validates :tag_id, uniqueness: {scope: :post_id} +end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 6d7dfd5..c0a6bb8 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -20,7 +20,7 @@ <% if user_signed_in? %> <%= link_to "Edit Profile", edit_users_path %> | <%= link_to "Logout", sessions_path, method: :delete %> | - Hi there <%= current_user.full_name %>, here are your + Hi there <%= current_user.full_name %>, here are your <%= current_user.favourites.length %> <%= link_to 'Favourite Posts', user_favourites_path(current_user) %> <% end %> diff --git a/app/views/posts/_form.html.erb b/app/views/posts/_form.html.erb index 5b8c761..f21fe2a 100644 --- a/app/views/posts/_form.html.erb +++ b/app/views/posts/_form.html.erb @@ -15,5 +15,9 @@ <%= f.label :body %> <%= f.text_area :body %>
+
+
+ <%= f.collection_check_boxes :tag_ids, Tag.all, :id, :name %> +
<%= f.submit "Submit" %> <% end %> diff --git a/app/views/posts/new.html.erb b/app/views/posts/new.html.erb index 2700c33..13f53fa 100644 --- a/app/views/posts/new.html.erb +++ b/app/views/posts/new.html.erb @@ -1,3 +1,5 @@

Create a New Post!

<%= render "form" %> + +JDKL:J diff --git a/app/views/posts/show.html.erb b/app/views/posts/show.html.erb index 6a6f7ae..e794211 100644 --- a/app/views/posts/show.html.erb +++ b/app/views/posts/show.html.erb @@ -29,10 +29,11 @@ <% @comments.each_with_index do |comment,i| %>

- Comment <%= i+1 %>: <%= comment.body %> + <%= User.find_by_id(comment.user_id).full_name %>: <%= comment.body %> <%= link_to "Edit", edit_post_comment_path(@post,comment) %> <%= link_to "Delete", post_comment_path(@post, comment), method: :delete, - data: {confirm: "Delete comment?"}%> + data: {confirm: "Delete comment?"}%>
+ commented at <%= comment.created_at %>:


diff --git a/db/migrate/20150619014257_create_tags.rb b/db/migrate/20150619014257_create_tags.rb new file mode 100644 index 0000000..965cd7a --- /dev/null +++ b/db/migrate/20150619014257_create_tags.rb @@ -0,0 +1,9 @@ +class CreateTags < ActiveRecord::Migration + def change + create_table :tags do |t| + t.string :name + + t.timestamps null: false + end + end +end diff --git a/db/migrate/20150619014310_create_taggings.rb b/db/migrate/20150619014310_create_taggings.rb new file mode 100644 index 0000000..0dd5c85 --- /dev/null +++ b/db/migrate/20150619014310_create_taggings.rb @@ -0,0 +1,10 @@ +class CreateTaggings < ActiveRecord::Migration + def change + create_table :taggings do |t| + t.references :tag, index: true, foreign_key: true + t.references :post, index: true, foreign_key: true + + t.timestamps null: false + end + end +end diff --git a/db/schema.rb b/db/schema.rb index dd4bae9..981cd32 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: 20150619002353) do +ActiveRecord::Schema.define(version: 20150619014310) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -72,6 +72,22 @@ add_index "posts", ["user_id"], name: "index_posts_on_user_id", using: :btree + create_table "taggings", force: :cascade do |t| + t.integer "tag_id" + t.integer "post_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + add_index "taggings", ["post_id"], name: "index_taggings_on_post_id", using: :btree + add_index "taggings", ["tag_id"], name: "index_taggings_on_tag_id", using: :btree + + create_table "tags", force: :cascade do |t| + t.string "name" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + create_table "titles", force: :cascade do |t| t.text "body" t.datetime "created_at", null: false @@ -93,4 +109,6 @@ add_foreign_key "favourites", "users" add_foreign_key "post_files", "posts" add_foreign_key "posts", "users" + add_foreign_key "taggings", "posts" + add_foreign_key "taggings", "tags" end diff --git a/db/seeds.rb b/db/seeds.rb index 4edb1e8..a6f8dda 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -5,3 +5,7 @@ # # cities = City.create([{ name: 'Chicago' }, { name: 'Copenhagen' }]) # Mayor.create(name: 'Emanuel', city: cities.first) + +['1','2','3','4','5','6','7'].each do |num| + Tag.create name: num +end diff --git a/test/fixtures/taggings.yml b/test/fixtures/taggings.yml new file mode 100644 index 0000000..cf134d9 --- /dev/null +++ b/test/fixtures/taggings.yml @@ -0,0 +1,9 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + tag_id: + post_id: + +two: + tag_id: + post_id: diff --git a/test/fixtures/tags.yml b/test/fixtures/tags.yml new file mode 100644 index 0000000..56066c6 --- /dev/null +++ b/test/fixtures/tags.yml @@ -0,0 +1,7 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + name: MyString + +two: + name: MyString diff --git a/test/models/tag_test.rb b/test/models/tag_test.rb new file mode 100644 index 0000000..b8498a1 --- /dev/null +++ b/test/models/tag_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class TagTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/models/tagging_test.rb b/test/models/tagging_test.rb new file mode 100644 index 0000000..77dbeac --- /dev/null +++ b/test/models/tagging_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class TaggingTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end From 4da920ae5f82dc87f8458967f7f137e837a14158 Mon Sep 17 00:00:00 2001 From: Murphy Stroppa Date: Sat, 20 Jun 2015 14:32:38 -0700 Subject: [PATCH 08/12] Added mailing to the post owner when someone comments --- .gitignore | 2 ++ app/controllers/comments_controller.rb | 1 + app/mailers/application_mailer.rb | 4 ++++ app/mailers/posts_mailer.rb | 8 ++++++++ app/views/layouts/mailer.html.erb | 5 +++++ app/views/layouts/mailer.text.erb | 1 + app/views/posts_mailer/notify_post_owner.html.erb | 2 ++ config/initializers/setup_mail.rb | 8 ++++++++ test/mailers/posts_mailer_test.rb | 7 +++++++ test/mailers/previews/posts_mailer_preview.rb | 4 ++++ 10 files changed, 42 insertions(+) create mode 100644 app/mailers/application_mailer.rb create mode 100644 app/mailers/posts_mailer.rb create mode 100644 app/views/layouts/mailer.html.erb create mode 100644 app/views/layouts/mailer.text.erb create mode 100644 app/views/posts_mailer/notify_post_owner.html.erb create mode 100644 config/initializers/setup_mail.rb create mode 100644 test/mailers/posts_mailer_test.rb create mode 100644 test/mailers/previews/posts_mailer_preview.rb diff --git a/.gitignore b/.gitignore index 5b61ab0..2784374 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,8 @@ # Ignore bundler config. /.bundle +/config/initializers/app_vars.rb + # Ignore all logfiles and tempfiles. /log/* !/log/.keep diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb index 13dea59..5117db9 100644 --- a/app/controllers/comments_controller.rb +++ b/app/controllers/comments_controller.rb @@ -9,6 +9,7 @@ def create @comment.post_id = params[:post_id] @comment.user = current_user if @comment.save + PostsMailer.notify_post_owner(@comment).deliver_now redirect_to post_path(@post) else flash[:alert] = "Something went wrong!" diff --git a/app/mailers/application_mailer.rb b/app/mailers/application_mailer.rb new file mode 100644 index 0000000..d25d889 --- /dev/null +++ b/app/mailers/application_mailer.rb @@ -0,0 +1,4 @@ +class ApplicationMailer < ActionMailer::Base + default from: "from@example.com" + layout 'mailer' +end diff --git a/app/mailers/posts_mailer.rb b/app/mailers/posts_mailer.rb new file mode 100644 index 0000000..871ee14 --- /dev/null +++ b/app/mailers/posts_mailer.rb @@ -0,0 +1,8 @@ +class PostsMailer < ApplicationMailer + + def notify_post_owner (comment) + @comment = comment + @user = @comment.post.user + mail(to: @user.email, subject: "Someone commented on your post") + end +end diff --git a/app/views/layouts/mailer.html.erb b/app/views/layouts/mailer.html.erb new file mode 100644 index 0000000..991cf0f --- /dev/null +++ b/app/views/layouts/mailer.html.erb @@ -0,0 +1,5 @@ + + + <%= yield %> + + diff --git a/app/views/layouts/mailer.text.erb b/app/views/layouts/mailer.text.erb new file mode 100644 index 0000000..37f0bdd --- /dev/null +++ b/app/views/layouts/mailer.text.erb @@ -0,0 +1 @@ +<%= yield %> diff --git a/app/views/posts_mailer/notify_post_owner.html.erb b/app/views/posts_mailer/notify_post_owner.html.erb new file mode 100644 index 0000000..f96f146 --- /dev/null +++ b/app/views/posts_mailer/notify_post_owner.html.erb @@ -0,0 +1,2 @@ +Hey <%= @user.full_name %>! Someone commented, "<%= @comment.body %>" on your +post titled <%= @comment.post.title %>. diff --git a/config/initializers/setup_mail.rb b/config/initializers/setup_mail.rb new file mode 100644 index 0000000..6c18985 --- /dev/null +++ b/config/initializers/setup_mail.rb @@ -0,0 +1,8 @@ +ActionMailer::Base.smtp_settings = { + address: "smtp.gmail.com", + port: "587", + enable_starttls_auto: true, + authentication: :plain, + user_name: ENV["email_user_name"], + password: ENV["email_password"] +} diff --git a/test/mailers/posts_mailer_test.rb b/test/mailers/posts_mailer_test.rb new file mode 100644 index 0000000..b5a885f --- /dev/null +++ b/test/mailers/posts_mailer_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class PostsMailerTest < ActionMailer::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/mailers/previews/posts_mailer_preview.rb b/test/mailers/previews/posts_mailer_preview.rb new file mode 100644 index 0000000..ef4ebb9 --- /dev/null +++ b/test/mailers/previews/posts_mailer_preview.rb @@ -0,0 +1,4 @@ +# Preview all emails at http://localhost:3000/rails/mailers/posts_mailer +class PostsMailerPreview < ActionMailer::Preview + +end From fa904830369e8ce394e49887990ee7a8028e93c3 Mon Sep 17 00:00:00 2001 From: Murphy Stroppa Date: Tue, 30 Jun 2015 16:37:06 -0700 Subject: [PATCH 09/12] Added AJAX functionality to comments. --- Gemfile | 32 ++++------- Gemfile.lock | 50 ++++++++++++++++++ app/assets/javascripts/application.js | 1 + .../stylesheets/bootstrap_and_overrides.scss | 2 + app/controllers/comments_controller.rb | 42 ++++++++++----- app/models/contact.rb | 5 -- app/views/comments/_comment.html.erb | 13 +++++ app/views/comments/_form.html.erb | 23 ++++++++ app/views/comments/create.js.erb | 4 ++ app/views/comments/create_failure.js.erb | 1 + app/views/comments/destroy.js.erb | 1 + app/views/comments/edit.html.erb | 11 +--- app/views/comments/edit.js.erb | 4 ++ app/views/comments/update.js.erb | 4 ++ app/views/layouts/application.html.erb | 45 ++++++++-------- app/views/posts/show.html.erb | 35 +++--------- bin/delayed_job | 5 ++ config/application.rb | 2 + config/environments/development.rb | 1 + config/routes.rb | 2 + db/migrate/20150609015835_create_contacts.rb | 12 ----- .../20150620220111_create_delayed_jobs.rb | 22 ++++++++ db/schema.rb | 18 ++++++- erd.pdf | Bin 0 -> 33988 bytes test/fixtures/contacts.yml | 13 ----- test/models/contact_test.rb | 7 --- 26 files changed, 221 insertions(+), 134 deletions(-) create mode 100644 app/assets/stylesheets/bootstrap_and_overrides.scss delete mode 100644 app/models/contact.rb create mode 100644 app/views/comments/_comment.html.erb create mode 100644 app/views/comments/_form.html.erb create mode 100644 app/views/comments/create.js.erb create mode 100644 app/views/comments/create_failure.js.erb create mode 100644 app/views/comments/destroy.js.erb create mode 100644 app/views/comments/edit.js.erb create mode 100644 app/views/comments/update.js.erb create mode 100755 bin/delayed_job delete mode 100644 db/migrate/20150609015835_create_contacts.rb create mode 100644 db/migrate/20150620220111_create_delayed_jobs.rb create mode 100644 erd.pdf delete mode 100644 test/fixtures/contacts.yml delete mode 100644 test/models/contact_test.rb diff --git a/Gemfile b/Gemfile index 4faa66e..b995f30 100644 --- a/Gemfile +++ b/Gemfile @@ -1,46 +1,32 @@ source 'https://rubygems.org' - - -# Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '4.2.1' -# Use postgresql as the database for Active Record gem 'pg' -# Use SCSS for stylesheets gem 'sass-rails', '~> 5.0' -# Use Uglifier as compressor for JavaScript assets gem 'uglifier', '>= 1.3.0' -# Use CoffeeScript for .coffee assets and views gem 'coffee-rails', '~> 4.1.0' -# See https://github.com/rails/execjs#readme for more supported runtimes -# gem 'therubyracer', platforms: :ruby - -# Use jquery as the JavaScript library gem 'jquery-rails' -# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks gem 'turbolinks' -# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder gem 'jbuilder', '~> 2.0' -# bundle exec rake doc:rails generates the API under doc/api. gem 'sdoc', '~> 0.4.0', group: :doc - -# Use ActiveModel has_secure_password gem 'bcrypt', '~> 3.1.7' - +gem 'delayed_job_active_record' +gem "delayed_job_web" +gem 'bootstrap-sass' +gem 'bootstrap-kaminari-views' +gem 'cancancan' +# , :group => :development # Use Unicorn as the app server # gem 'unicorn' - # Use Capistrano for deployment # gem 'capistrano-rails', group: :development - group :development, :test do - # Call 'byebug' anywhere in the code to stop execution and get a debugger console gem 'byebug' gem "hirb" gem "awesome_print" gem "interactive_editor" - # Access an IRB console on exception pages or by using <%= console %> in views gem 'web-console', '~> 2.0' - - # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring + gem "letter_opener" gem 'spring' + gem "faker" + gem "rails-erd" end diff --git a/Gemfile.lock b/Gemfile.lock index ceaa59c..d85a93f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -36,14 +36,26 @@ GEM minitest (~> 5.1) thread_safe (~> 0.3, >= 0.3.4) tzinfo (~> 1.1) + addressable (2.3.8) arel (6.0.0) + autoprefixer-rails (5.2.0) + execjs + json awesome_print (1.6.1) bcrypt (3.1.10) binding_of_caller (0.7.2) debug_inspector (>= 0.0.1) + bootstrap-kaminari-views (0.0.5) + kaminari (>= 0.13) + rails (>= 3.1) + bootstrap-sass (3.3.4.1) + autoprefixer-rails (>= 5.0.0.1) + sass (>= 3.2.19) builder (3.2.2) byebug (5.0.0) columnize (= 0.9.0) + cancancan (1.10.1) + choice (0.2.0) coffee-rails (4.1.0) coffee-script (>= 2.2.0) railties (>= 4.0.0, < 5.0) @@ -53,8 +65,19 @@ GEM coffee-script-source (1.9.1.1) columnize (0.9.0) debug_inspector (0.0.2) + delayed_job (4.0.6) + activesupport (>= 3.0, < 5.0) + delayed_job_active_record (4.0.3) + activerecord (>= 3.0, < 5.0) + delayed_job (>= 3.0, < 4.1) + delayed_job_web (1.2.10) + activerecord (> 3.0.0) + delayed_job (> 2.0.3) + sinatra (>= 1.4.4) erubis (2.7.0) execjs (2.5.2) + faker (1.4.3) + i18n (~> 0.5) ffi (1.9.8) globalid (0.3.5) activesupport (>= 4.1.0) @@ -70,6 +93,13 @@ GEM railties (>= 4.2.0) thor (>= 0.14, < 2.0) json (1.8.3) + kaminari (0.16.3) + actionpack (>= 3.0.0) + activesupport (>= 3.0.0) + launchy (2.4.3) + addressable (~> 2.3) + letter_opener (1.4.1) + launchy (~> 2.2) loofah (2.0.2) nokogiri (>= 1.5.9) mail (2.6.3) @@ -82,6 +112,8 @@ GEM mini_portile (~> 0.6.0) pg (0.18.2) rack (1.6.1) + rack-protection (1.5.3) + rack rack-test (0.6.3) rack (>= 1.0) rails (4.2.1) @@ -101,6 +133,11 @@ GEM activesupport (>= 4.2.0.beta, < 5.0) nokogiri (~> 1.6.0) rails-deprecated_sanitizer (>= 1.0.1) + rails-erd (1.4.0) + activerecord (>= 3.2) + activesupport (>= 3.2) + choice (~> 0.2.0) + ruby-graphviz (~> 1.2) rails-html-sanitizer (1.0.2) loofah (~> 2.0) railties (4.2.1) @@ -110,6 +147,7 @@ GEM thor (>= 0.18.1, < 2.0) rake (10.4.2) rdoc (4.2.0) + ruby-graphviz (1.2.2) sass (3.4.14) sass-rails (5.0.3) railties (>= 4.0.0, < 5.0) @@ -120,6 +158,10 @@ GEM sdoc (0.4.1) json (~> 1.7, >= 1.7.7) rdoc (~> 4.0) + sinatra (1.4.6) + rack (~> 1.4) + rack-protection (~> 1.4) + tilt (>= 1.3, < 3) spoon (0.0.4) ffi spring (1.3.6) @@ -151,14 +193,22 @@ PLATFORMS DEPENDENCIES awesome_print bcrypt (~> 3.1.7) + bootstrap-kaminari-views + bootstrap-sass byebug + cancancan coffee-rails (~> 4.1.0) + delayed_job_active_record + delayed_job_web + faker hirb interactive_editor jbuilder (~> 2.0) jquery-rails + letter_opener pg rails (= 4.2.1) + rails-erd sass-rails (~> 5.0) sdoc (~> 0.4.0) spring diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index e07c5a8..1662961 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -13,4 +13,5 @@ //= require jquery //= require jquery_ujs //= require turbolinks +//= require bootstrap //= require_tree . diff --git a/app/assets/stylesheets/bootstrap_and_overrides.scss b/app/assets/stylesheets/bootstrap_and_overrides.scss new file mode 100644 index 0000000..baccee2 --- /dev/null +++ b/app/assets/stylesheets/bootstrap_and_overrides.scss @@ -0,0 +1,2 @@ +@import "bootstrap-sprockets"; +@import "bootstrap"; diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb index 5117db9..9711c40 100644 --- a/app/controllers/comments_controller.rb +++ b/app/controllers/comments_controller.rb @@ -8,12 +8,17 @@ def create @comment = Comment.new comment_params @comment.post_id = params[:post_id] @comment.user = current_user - if @comment.save - PostsMailer.notify_post_owner(@comment).deliver_now - redirect_to post_path(@post) - else - flash[:alert] = "Something went wrong!" - render "/posts/show" + respond_to do |format| + if @comment.save + # PostsMailer.notify_post_owner(@comment).deliver_now + PostsMailer.delay.notify_post_owner(@comment) + format.js { render } + format.html { redirect_to post_path(@post) } + else + @comments = Comment.search(@post.id) + format.js { render :create_failure } + format.html { render "/posts/show" } + end end end @@ -26,19 +31,28 @@ def update @post = Post.find params[:post_id] comment_params = params.require(:comment).permit(:body) @comment = Comment.find params[:id] - if @comment.update comment_params - redirect_to post_path(@post) - else - render :edit, notice: "Failed to update." + respond_to do |format| + if @comment.update comment_params + format.js { render :update } + format.html {redirect_to post_path(@post)} + else + format.js { render } + format.html {render :edit, notice: "Failed to update."} + end end end def destroy post = Post.find params[:post_id] - comment = Comment.find params[:id] - comment.destroy - flash[:notice] = "Comment successfully deleted \n\n" - redirect_to post + @comment = Comment.find params[:id] + @comment.destroy + respond_to do |format| + format.js { render } + format.html { + flash[:notice] = "Comment successfully deleted \n\n" + redirect_to post + } + end end end diff --git a/app/models/contact.rb b/app/models/contact.rb deleted file mode 100644 index 1603587..0000000 --- a/app/models/contact.rb +++ /dev/null @@ -1,5 +0,0 @@ -class Contact < ActiveRecord::Base - - - -end diff --git a/app/views/comments/_comment.html.erb b/app/views/comments/_comment.html.erb new file mode 100644 index 0000000..617d81c --- /dev/null +++ b/app/views/comments/_comment.html.erb @@ -0,0 +1,13 @@ +
+ +

+ <%= User.find_by_id(comment.user_id).full_name %>: <%= comment.body %> + <%= link_to "Edit", edit_post_comment_path(@post,comment), remote: true %> + <%= link_to "Delete", post_comment_path(@post, comment), method: :delete, + data: {confirm: "Delete comment?"}, remote: true %>
+ commented at <%= comment.created_at %>: +

+
+ + +
diff --git a/app/views/comments/_form.html.erb b/app/views/comments/_form.html.erb new file mode 100644 index 0000000..d14c3af --- /dev/null +++ b/app/views/comments/_form.html.erb @@ -0,0 +1,23 @@ +<%= form_for [@post, @comment], html: {class: "form-horizontal"}, remote: true do |f| %> +
+
+ <%= f.label :body %> +
+ + <%= f.text_area :body, html: {class: "form-control"}, :cols => 100, :rows => 5 %> +
+ <%= f.submit class: "btn btn-primary" %> + + +

+ + <% if @comment.errors.any? %> + <% @comment.errors.full_messages.each do |msg| %> + <%= msg %>
+ <% end %> + <% end %> +
+ +
+ +<% end %> diff --git a/app/views/comments/create.js.erb b/app/views/comments/create.js.erb new file mode 100644 index 0000000..9b76c9d --- /dev/null +++ b/app/views/comments/create.js.erb @@ -0,0 +1,4 @@ +$('#comment_box').prepend("<%= j render 'comment', comment: @comment %>") + +<% @comment = Comment.new %> +$('#new_comment').replaceWith("<%= j render 'form' %>") diff --git a/app/views/comments/create_failure.js.erb b/app/views/comments/create_failure.js.erb new file mode 100644 index 0000000..8b5725d --- /dev/null +++ b/app/views/comments/create_failure.js.erb @@ -0,0 +1 @@ +$('#new_comment').replaceWith(" <%= j render 'form' %>"); diff --git a/app/views/comments/destroy.js.erb b/app/views/comments/destroy.js.erb new file mode 100644 index 0000000..14901e6 --- /dev/null +++ b/app/views/comments/destroy.js.erb @@ -0,0 +1 @@ +$("#<%= dom_id(@comment) %>").fadeOut() diff --git a/app/views/comments/edit.html.erb b/app/views/comments/edit.html.erb index 6d9f8f0..9479e54 100644 --- a/app/views/comments/edit.html.erb +++ b/app/views/comments/edit.html.erb @@ -1,11 +1,2 @@

Edit the Comment

- - - -<%= form_for [@post, @comment] do |f| %> -
- <%= f.label :body %> - <%= f.text_area :body %> -
- <%= f.submit %> -<% end %> +<%= render 'form' %> diff --git a/app/views/comments/edit.js.erb b/app/views/comments/edit.js.erb new file mode 100644 index 0000000..c32dbc6 --- /dev/null +++ b/app/views/comments/edit.js.erb @@ -0,0 +1,4 @@ +$('#<%= dom_id(@comment) %>').fadeOut() +setTimeout(function() { + $("#<%= dom_id(@comment) %>").replaceWith("<%= j render 'form' %>") +},300) diff --git a/app/views/comments/update.js.erb b/app/views/comments/update.js.erb new file mode 100644 index 0000000..9e41c38 --- /dev/null +++ b/app/views/comments/update.js.erb @@ -0,0 +1,4 @@ +$('#<%= dom_id(@comment, :edit) %>').fadeOut() +setTimeout(function() { + $('#<%= dom_id(@comment, :edit) %>').replaceWith("<%= j render 'comment', comment: @comment %>") +},300) diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index c0a6bb8..0a8c30d 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -7,30 +7,31 @@ <%= csrf_meta_tags %> -<%= link_to "Home", root_path %> | -<%= link_to "About Me", home_about_path %> | -<%= link_to "All Posts", posts_path %> | -<%= link_to "Add a Post", new_post_path %> | +
+ <%= link_to "Home", root_path %> | + <%= link_to "About Me", home_about_path %> | + <%= link_to "All Posts", posts_path %> | + <%= link_to "Add a Post", new_post_path %> | -<% unless user_signed_in? %> - <%= link_to "Sign up", new_user_path %> | - <%= link_to "Login", new_session_path %> + <% unless user_signed_in? %> + <%= link_to "Sign up", new_user_path %> | + <%= link_to "Login", new_session_path %> -<% end %> -<% if user_signed_in? %> - <%= link_to "Edit Profile", edit_users_path %> | - <%= link_to "Logout", sessions_path, method: :delete %> | - Hi there <%= current_user.full_name %>, here are your <%= current_user.favourites.length %> - <%= link_to 'Favourite Posts', user_favourites_path(current_user) %> - -<% end %> -<% if flash[:alert] %> -

<%= flash[:alert] %>
-<% end %> -<% if flash[:notice] %> -

<%= flash[:notice] %>
-<% end %> -<%= yield %> + <% end %> + <% if user_signed_in? %> + <%= link_to "Edit Profile", edit_users_path %> | + <%= link_to "Logout", sessions_path, method: :delete %> | + Hi there <%= current_user.full_name %>, here are your <%= current_user.favourites.length %> + <%= link_to 'Favourite Posts', user_favourites_path(current_user) %> + <% end %> + <% if flash[:alert] %> +

<%= flash[:alert] %>
+ <% end %> + <% if flash[:notice] %> +

<%= flash[:notice] %>
+ <% end %> + <%= yield %> +
diff --git a/app/views/posts/show.html.erb b/app/views/posts/show.html.erb index e794211..aecd5cc 100644 --- a/app/views/posts/show.html.erb +++ b/app/views/posts/show.html.erb @@ -11,41 +11,22 @@ <%= link_to "Favourite", post_favourites_path(@post), method: :post %> <% end %> <%= link_to "Edit", edit_post_path(@post) %> - <%= link_to "Delete", post_path(@post), method: :delete, + <%= link_to "Delete", post_path(@post), method: :delete, remote: true, data: { confirm: "Are you sure you want to delete this?" } %> <% end %> -<% if flash[:alert] %> -


- <%= flash[:alert] %> - <% if @comment.errors.any? %> - <% @comment.errors.full_messages.each do |msg| %> - <%= msg %> - <% end %> - <% end %> -


-<% end %> -
+ + +<%= render "/comments/form" %> + +
<%# @post.comments.sort_by {|comment| comment.id }.reverse.each_with_index do |comment,i| %> <% @comments.each_with_index do |comment,i| %> -

- <%= User.find_by_id(comment.user_id).full_name %>: <%= comment.body %> - <%= link_to "Edit", edit_post_comment_path(@post,comment) %> - <%= link_to "Delete", post_comment_path(@post, comment), method: :delete, - data: {confirm: "Delete comment?"}%>
- commented at <%= comment.created_at %>: -

-
+ <%= render "/comments/comment", comment: comment %> <% end %> <%= flash[:notice] if flash[:notice] %> -<%= form_for [@post, @comment] do |f| %> -
- <%= f.label :body %> - <%= f.text_area :body %> -
- <%= f.submit %> -<% end %> +
diff --git a/bin/delayed_job b/bin/delayed_job new file mode 100755 index 0000000..edf1959 --- /dev/null +++ b/bin/delayed_job @@ -0,0 +1,5 @@ +#!/usr/bin/env ruby + +require File.expand_path(File.join(File.dirname(__FILE__), '..', 'config', 'environment')) +require 'delayed/command' +Delayed::Command.new(ARGV).daemonize diff --git a/config/application.rb b/config/application.rb index ecd54d7..de85bd8 100644 --- a/config/application.rb +++ b/config/application.rb @@ -20,6 +20,8 @@ class Application < Rails::Application # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] # config.i18n.default_locale = :de + config.active_job.queue_adapter = :delayed_job + # Do not swallow errors in after_commit/after_rollback callbacks. config.active_record.raise_in_transactional_callbacks = true end diff --git a/config/environments/development.rb b/config/environments/development.rb index b55e214..50162d1 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -36,6 +36,7 @@ # Raises helpful error messages. config.assets.raise_runtime_errors = true + config.action_mailer.delivery_method = :letter_opener # Raises error for missing translations # config.action_view.raise_on_missing_translations = true end diff --git a/config/routes.rb b/config/routes.rb index 0f21916..d25bff5 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -3,6 +3,8 @@ root "home#index" get "/home/about" => "home#about" + match "/delayed_job" => DelayedJobWeb, :anchor => false, via: [:get, :post] + resources :users, only: [:new, :create] do resources :favourites, only: [:index] get :edit, on: :collection diff --git a/db/migrate/20150609015835_create_contacts.rb b/db/migrate/20150609015835_create_contacts.rb deleted file mode 100644 index 5298b22..0000000 --- a/db/migrate/20150609015835_create_contacts.rb +++ /dev/null @@ -1,12 +0,0 @@ -class CreateContacts < ActiveRecord::Migration - def change - create_table :contacts do |t| - t.string :email - t.string :name - t.string :subject - t.text :message - - t.timestamps null: false - end - end -end diff --git a/db/migrate/20150620220111_create_delayed_jobs.rb b/db/migrate/20150620220111_create_delayed_jobs.rb new file mode 100644 index 0000000..27fdcf6 --- /dev/null +++ b/db/migrate/20150620220111_create_delayed_jobs.rb @@ -0,0 +1,22 @@ +class CreateDelayedJobs < ActiveRecord::Migration + def self.up + create_table :delayed_jobs, force: true do |table| + table.integer :priority, default: 0, null: false # Allows some jobs to jump to the front of the queue + table.integer :attempts, default: 0, null: false # Provides for retries, but still fail eventually. + table.text :handler, null: false # YAML-encoded string of the object that will do work + table.text :last_error # reason for last failure (See Note below) + table.datetime :run_at # When to run. Could be Time.zone.now for immediately, or sometime in the future. + table.datetime :locked_at # Set when a client is working on this object + table.datetime :failed_at # Set when all retries have failed (actually, by default, the record is deleted instead) + table.string :locked_by # Who is working on this object (if locked) + table.string :queue # The name of the queue this job is in + table.timestamps null: true + end + + add_index :delayed_jobs, [:priority, :run_at], name: "delayed_jobs_priority" + end + + def self.down + drop_table :delayed_jobs + end +end diff --git a/db/schema.rb b/db/schema.rb index 981cd32..82e4941 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: 20150619014310) do +ActiveRecord::Schema.define(version: 20150620220111) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -42,6 +42,22 @@ t.datetime "updated_at", null: false end + create_table "delayed_jobs", force: :cascade do |t| + t.integer "priority", default: 0, null: false + t.integer "attempts", default: 0, null: false + t.text "handler", null: false + t.text "last_error" + t.datetime "run_at" + t.datetime "locked_at" + t.datetime "failed_at" + t.string "locked_by" + t.string "queue" + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "delayed_jobs", ["priority", "run_at"], name: "delayed_jobs_priority", using: :btree + create_table "favourites", force: :cascade do |t| t.integer "user_id" t.integer "post_id" diff --git a/erd.pdf b/erd.pdf new file mode 100644 index 0000000000000000000000000000000000000000..12bd30f4b25eac8e6d385908b4214efd8edc2511 GIT binary patch literal 33988 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 A-~a#s literal 0 HcmV?d00001 diff --git a/test/fixtures/contacts.yml b/test/fixtures/contacts.yml deleted file mode 100644 index db36c32..0000000 --- a/test/fixtures/contacts.yml +++ /dev/null @@ -1,13 +0,0 @@ -# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html - -one: - email: MyString - name: MyString - subject: MyString - message: MyText - -two: - email: MyString - name: MyString - subject: MyString - message: MyText diff --git a/test/models/contact_test.rb b/test/models/contact_test.rb deleted file mode 100644 index ccef1f9..0000000 --- a/test/models/contact_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class ContactTest < ActiveSupport::TestCase - # test "the truth" do - # assert true - # end -end From a5f17e454b3e18468a25bf20c08a6867c9d10aa5 Mon Sep 17 00:00:00 2001 From: Murphy Stroppa Date: Tue, 30 Jun 2015 18:29:59 -0700 Subject: [PATCH 10/12] Automatically run the rake task every 24 hours at 6:28 --- Gemfile | 1 + Gemfile.lock | 4 +++ app/mailers/posts_mailer.rb | 7 +++++ .../notify_post_owners_summary.html.erb | 7 +++++ config/initializers/core_extensions.rb | 16 ++++++++++ config/schedule.rb | 26 ++++++++++++++++ lib/tasks/post.rake | 30 +++++++++++++++++++ 7 files changed, 91 insertions(+) create mode 100644 app/views/posts_mailer/notify_post_owners_summary.html.erb create mode 100644 config/initializers/core_extensions.rb create mode 100644 config/schedule.rb create mode 100644 lib/tasks/post.rake diff --git a/Gemfile b/Gemfile index b995f30..e5da15e 100644 --- a/Gemfile +++ b/Gemfile @@ -14,6 +14,7 @@ gem "delayed_job_web" gem 'bootstrap-sass' gem 'bootstrap-kaminari-views' gem 'cancancan' +gem 'whenever', :require => false # , :group => :development # Use Unicorn as the app server # gem 'unicorn' diff --git a/Gemfile.lock b/Gemfile.lock index d85a93f..32bc56a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -56,6 +56,7 @@ GEM columnize (= 0.9.0) cancancan (1.10.1) choice (0.2.0) + chronic (0.10.2) coffee-rails (4.1.0) coffee-script (>= 2.2.0) railties (>= 4.0.0, < 5.0) @@ -186,6 +187,8 @@ GEM binding_of_caller (>= 0.7.2) railties (>= 4.0) sprockets-rails (>= 2.0, < 4.0) + whenever (0.9.4) + chronic (>= 0.6.3) PLATFORMS ruby @@ -215,6 +218,7 @@ DEPENDENCIES turbolinks uglifier (>= 1.3.0) web-console (~> 2.0) + whenever BUNDLED WITH 1.10.2 diff --git a/app/mailers/posts_mailer.rb b/app/mailers/posts_mailer.rb index 871ee14..e58a140 100644 --- a/app/mailers/posts_mailer.rb +++ b/app/mailers/posts_mailer.rb @@ -5,4 +5,11 @@ def notify_post_owner (comment) @user = @comment.post.user mail(to: @user.email, subject: "Someone commented on your post") end + + def notify_post_owners_summary clustered_array + clustered_array.each_with_index do |cluster, i| + @cluster = cluster + mail(to: @cluster[0].post.user.email, subject: "Comments in the last 24 hours") + end + end end diff --git a/app/views/posts_mailer/notify_post_owners_summary.html.erb b/app/views/posts_mailer/notify_post_owners_summary.html.erb new file mode 100644 index 0000000..8c38993 --- /dev/null +++ b/app/views/posts_mailer/notify_post_owners_summary.html.erb @@ -0,0 +1,7 @@ +Here are the comments made in the last 24 hours, <%= @cluster[0].post.user.full_name %> + +<% @cluster.each do |comment| %> +
+ <%= comment.user.full_name %> said: <%= comment.body %> +
+<% end %> diff --git a/config/initializers/core_extensions.rb b/config/initializers/core_extensions.rb new file mode 100644 index 0000000..557eef0 --- /dev/null +++ b/config/initializers/core_extensions.rb @@ -0,0 +1,16 @@ +module Enumerable + # clumps adjacent elements together + # >> [2,2,2,3,3,4,2,2,1].cluster{|x| x} + # => [[2, 2, 2], [3, 3], [4], [2, 2], [1]] + def cluster + cluster = [] + each do |element| + if cluster.last && yield(cluster.last.last) == yield(element) + cluster.last << element + else + cluster << [element] + end + end + cluster + end +end diff --git a/config/schedule.rb b/config/schedule.rb new file mode 100644 index 0000000..c1df104 --- /dev/null +++ b/config/schedule.rb @@ -0,0 +1,26 @@ +# Use this file to easily define all of your cron jobs. +# +# It's helpful, but not entirely necessary to understand cron before proceeding. +# http://en.wikipedia.org/wiki/Cron + +# Example: +# +# set :output, "/path/to/my/cron_log.log" +# +# every 2.hours do +# command "/usr/bin/some_great_command" +# runner "MyModel.some_method" +# rake "some:great:rake:task" +# end +# +# every 4.days do +# runner "AnotherModel.prune_old_records" +# end + +# Learn more: http://github.com/javan/whenever +set :environment, "development" +set :output, {:error => "log/cron_error_log.log", :standard => "log/cron_log.log"} + +every :day, :at => '6:28pm' do + rake "post:comments" +end diff --git a/lib/tasks/post.rake b/lib/tasks/post.rake new file mode 100644 index 0000000..1587aaa --- /dev/null +++ b/lib/tasks/post.rake @@ -0,0 +1,30 @@ +namespace :post do + desc "Tasks associated with posts" + task comments: :environment do + new_comments = [] + Comment.where("created_at > ?", 1.day.ago).each {|comment| new_comments << comment} + sorted_new_comments = new_comments.sort_by { |comment| comment.post.user } + new_comments.each { |comment| p comment.post.user } + p sorted_new_comments == new_comments + sorted_new_comments.each { |comment| p comment.post.user } + @clustered_comments = sorted_new_comments.cluster { |comment| comment.post.user } + @clustered_comments.each {|c| p c[0].post.user.email} + PostsMailer.notify_post_owners_summary(@clustered_comments).deliver_now + end +end + + +# Stretch: Setup a rake task that does the following: +# Make a summary (list) of all newly created comments that that day for posts +# Send an email with the summary to posts owners + +#find all comments less than a day old +# +#group them somehow +# +#User.all.each +#Post.all.each do |post| +# post.comments.where("created_at < ?", 1.day.ago).each do |comment| +# p comment.body +# end +#end From 9f37d0d45388102cb34f6ced6d16f08d861f077b Mon Sep 17 00:00:00 2001 From: Murphy Stroppa Date: Thu, 2 Jul 2015 18:52:38 -0700 Subject: [PATCH 11/12] Added ability to add an asset to a post --- Gemfile | 4 ++ Gemfile.lock | 8 +++ app/controllers/posts_controller.rb | 4 +- app/models/post.rb | 3 +- app/uploaders/asset_uploader.rb | 51 ++++++++++++++++++ app/views/posts/_form.html.erb | 4 ++ .../20150703013105_add_asset_to_posts.rb | 5 ++ db/schema.rb | 3 +- lib/tasks/post.rake | 10 ++-- .../15/Photo_on_2015-06-20_at_7.49_AM.jpg | Bin 0 -> 155867 bytes public/uploads/post/asset/16/config.ru | 4 ++ 11 files changed, 88 insertions(+), 8 deletions(-) create mode 100644 app/uploaders/asset_uploader.rb create mode 100644 db/migrate/20150703013105_add_asset_to_posts.rb create mode 100644 public/uploads/post/asset/15/Photo_on_2015-06-20_at_7.49_AM.jpg create mode 100644 public/uploads/post/asset/16/config.ru diff --git a/Gemfile b/Gemfile index e5da15e..0efb57d 100644 --- a/Gemfile +++ b/Gemfile @@ -15,6 +15,10 @@ gem 'bootstrap-sass' gem 'bootstrap-kaminari-views' gem 'cancancan' gem 'whenever', :require => false +gem 'carrierwave' +gem "mini_magick" + + # , :group => :development # Use Unicorn as the app server # gem 'unicorn' diff --git a/Gemfile.lock b/Gemfile.lock index 32bc56a..82a883e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -55,6 +55,11 @@ GEM byebug (5.0.0) columnize (= 0.9.0) cancancan (1.10.1) + carrierwave (0.10.0) + activemodel (>= 3.2.0) + activesupport (>= 3.2.0) + json (>= 1.7) + mime-types (>= 1.16) choice (0.2.0) chronic (0.10.2) coffee-rails (4.1.0) @@ -106,6 +111,7 @@ GEM mail (2.6.3) mime-types (>= 1.16, < 3) mime-types (2.6.1) + mini_magick (4.2.7) mini_portile (0.6.2) minitest (5.7.0) multi_json (1.11.0) @@ -200,6 +206,7 @@ DEPENDENCIES bootstrap-sass byebug cancancan + carrierwave coffee-rails (~> 4.1.0) delayed_job_active_record delayed_job_web @@ -209,6 +216,7 @@ DEPENDENCIES jbuilder (~> 2.0) jquery-rails letter_opener + mini_magick pg rails (= 4.2.1) rails-erd diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb index f8825fa..8f4f81d 100644 --- a/app/controllers/posts_controller.rb +++ b/app/controllers/posts_controller.rb @@ -11,7 +11,7 @@ def new end def create - post_params = params.require(:post).permit(:title, :body, {tag_ids: []}) + post_params = params.require(:post).permit(:asset, :title, :body, {tag_ids: []}) @post = Post.new post_params @post.user = current_user if @post.save @@ -42,7 +42,7 @@ def edit def update @post = Post.find params[:id] - post_params = params.require(:post).permit(:title, :body, {tag_ids: []}) + post_params = params.require(:post).permit(:asset, :title, :body, {tag_ids: []}) if @post.update post_params flash[:notice] = "Successfully updated post!" redirect_to posts_path diff --git a/app/models/post.rb b/app/models/post.rb index 354b4e0..d52ee22 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -1,9 +1,10 @@ class Post < ActiveRecord::Base + mount_uploader :asset, AssetUploader + has_many :taggings, dependent: :destroy has_many :tags, through: :taggings - has_many :favourites, dependent: :destroy has_many :favouriting_users, through: :favourites, source: :user diff --git a/app/uploaders/asset_uploader.rb b/app/uploaders/asset_uploader.rb new file mode 100644 index 0000000..ec7137f --- /dev/null +++ b/app/uploaders/asset_uploader.rb @@ -0,0 +1,51 @@ +# encoding: utf-8 + +class AssetUploader < CarrierWave::Uploader::Base + + # Include RMagick or MiniMagick support: + # include CarrierWave::RMagick + # include CarrierWave::MiniMagick + + # Choose what kind of storage to use for this uploader: + storage :file + # storage :fog + + # Override the directory where uploaded files will be stored. + # This is a sensible default for uploaders that are meant to be mounted: + def store_dir + "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" + end + + # Provide a default URL as a default if there hasn't been a file uploaded: + # def default_url + # # For Rails 3.1+ asset pipeline compatibility: + # # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_')) + # + # "/images/fallback/" + [version_name, "default.png"].compact.join('_') + # end + + # Process files as they are uploaded: + # process :scale => [200, 300] + # + # def scale(width, height) + # # do something + # end + + # Create different versions of your uploaded files: + # version :thumb do + # process :resize_to_fit => [50, 50] + # end + + #Add a white list of extensions which are allowed to be uploaded. + # For images you might use something like this: + #def extension_white_list + # %w(jpg jpeg gif png) + #end + + # Override the filename of the uploaded files: + # Avoid using model.id or version_name here, see uploader/store.rb for details. + # def filename + # "something.jpg" if original_filename + # end + +end diff --git a/app/views/posts/_form.html.erb b/app/views/posts/_form.html.erb index f21fe2a..dc824b1 100644 --- a/app/views/posts/_form.html.erb +++ b/app/views/posts/_form.html.erb @@ -11,6 +11,10 @@ <%= f.label :title %> <%= f.text_field :title %>
+
+ <%= f.label :asset %> + <%= f.file_field :asset %> +
<%= f.label :body %> <%= f.text_area :body %> diff --git a/db/migrate/20150703013105_add_asset_to_posts.rb b/db/migrate/20150703013105_add_asset_to_posts.rb new file mode 100644 index 0000000..bb29633 --- /dev/null +++ b/db/migrate/20150703013105_add_asset_to_posts.rb @@ -0,0 +1,5 @@ +class AddAssetToPosts < ActiveRecord::Migration + def change + add_column :posts, :asset, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index 82e4941..7812a93 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: 20150620220111) do +ActiveRecord::Schema.define(version: 20150703013105) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -84,6 +84,7 @@ t.datetime "created_at", null: false t.datetime "updated_at", null: false t.integer "user_id" + t.string "asset" end add_index "posts", ["user_id"], name: "index_posts_on_user_id", using: :btree diff --git a/lib/tasks/post.rake b/lib/tasks/post.rake index 1587aaa..a9efbe7 100644 --- a/lib/tasks/post.rake +++ b/lib/tasks/post.rake @@ -2,11 +2,13 @@ namespace :post do desc "Tasks associated with posts" task comments: :environment do new_comments = [] - Comment.where("created_at > ?", 1.day.ago).each {|comment| new_comments << comment} + comments = Comment.includes(post: :user).where('created_at > ?', 1.day.ago) + comments.each {|comment| new_comments << comment} + #Comment.where("created_at > ?", 1.day.ago).each {|comment| new_comments << comment} sorted_new_comments = new_comments.sort_by { |comment| comment.post.user } - new_comments.each { |comment| p comment.post.user } - p sorted_new_comments == new_comments - sorted_new_comments.each { |comment| p comment.post.user } + #new_comments.each { |comment| p comment.post.user } + #p sorted_new_comments == new_comments + #sorted_new_comments.each { |comment| p comment.post.user } @clustered_comments = sorted_new_comments.cluster { |comment| comment.post.user } @clustered_comments.each {|c| p c[0].post.user.email} PostsMailer.notify_post_owners_summary(@clustered_comments).deliver_now diff --git a/public/uploads/post/asset/15/Photo_on_2015-06-20_at_7.49_AM.jpg b/public/uploads/post/asset/15/Photo_on_2015-06-20_at_7.49_AM.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4209deebe4403d8003231c6917d9a8769a5c9709 GIT binary patch literal 155867 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 P`ewhKY0OKF_CNpGSCIz5 literal 0 HcmV?d00001 diff --git a/public/uploads/post/asset/16/config.ru b/public/uploads/post/asset/16/config.ru new file mode 100644 index 0000000..bd83b25 --- /dev/null +++ b/public/uploads/post/asset/16/config.ru @@ -0,0 +1,4 @@ +# This file is used by Rack-based servers to start the application. + +require ::File.expand_path('../config/environment', __FILE__) +run Rails.application From cfdcd13bd0fc53df8e1b614e11d379d236c4b228 Mon Sep 17 00:00:00 2001 From: Murphy Stroppa Date: Fri, 3 Jul 2015 09:08:56 -0700 Subject: [PATCH 12/12] Remove random line of text --- app/views/posts/new.html.erb | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/views/posts/new.html.erb b/app/views/posts/new.html.erb index 13f53fa..2700c33 100644 --- a/app/views/posts/new.html.erb +++ b/app/views/posts/new.html.erb @@ -1,5 +1,3 @@

Create a New Post!

<%= render "form" %> - -JDKL:J