From 91b52ad8d2df3c772cf9011d25173095ec5d38e2 Mon Sep 17 00:00:00 2001 From: rgarcia Date: Wed, 5 Aug 2015 12:12:56 +0200 Subject: [PATCH] refactors voting implementation [#25] --- app/controllers/comments_controller.rb | 8 +++++- app/controllers/debates_controller.rb | 10 +++++-- app/controllers/votes_controller.rb | 38 -------------------------- app/views/comments/_votes.html.erb | 4 +-- app/views/comments/vote.js.erb | 1 + app/views/debates/_votes.html.erb | 6 ++-- app/views/debates/vote.js.erb | 1 + app/views/votes/create.js.erb | 2 -- config/routes.rb | 17 ++++++------ 9 files changed, 31 insertions(+), 56 deletions(-) delete mode 100644 app/controllers/votes_controller.rb create mode 100644 app/views/comments/vote.js.erb create mode 100644 app/views/debates/vote.js.erb delete mode 100644 app/views/votes/create.js.erb diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb index 00fd20653..409bb7c9b 100644 --- a/app/controllers/comments_controller.rb +++ b/app/controllers/comments_controller.rb @@ -1,6 +1,6 @@ class CommentsController < ApplicationController before_action :authenticate_user! - before_action :set_debate, :set_parent + before_action :set_debate, :set_parent, only: :create respond_to :html, :js def create @@ -10,6 +10,12 @@ class CommentsController < ApplicationController respond_with @comment end + def vote + @comment = Comment.find(params[:id]) + @comment.vote_by(voter: current_user, vote: params[:value]) + respond_with @comment + end + private def comment_params params.require(:comments).permit(:commentable_type, :commentable_id, :body) diff --git a/app/controllers/debates_controller.rb b/app/controllers/debates_controller.rb index 672f41d20..fe572abe4 100644 --- a/app/controllers/debates_controller.rb +++ b/app/controllers/debates_controller.rb @@ -1,7 +1,7 @@ class DebatesController < ApplicationController - include RecaptchaHelper - before_action :set_debate, only: [:show, :edit, :update] - before_action :authenticate_user!, except: [:show, :index] + include RecaptchaHelper + before_action :set_debate, only: [:show, :edit, :update, :vote] + before_action :authenticate_user!, except: [:index, :show, :vote] before_action :validate_ownership, only: [:edit, :update] def index @@ -37,6 +37,10 @@ class DebatesController < ApplicationController respond_with @debate end + def vote + @debate.vote_by(voter: current_user, vote: params[:value]) + end + private def set_debate diff --git a/app/controllers/votes_controller.rb b/app/controllers/votes_controller.rb deleted file mode 100644 index c42935ddf..000000000 --- a/app/controllers/votes_controller.rb +++ /dev/null @@ -1,38 +0,0 @@ -class VotesController < ApplicationController - before_action :set_debate - before_action :set_resource - before_action :authenticate_user! - respond_to :html, :js - - def create - register_vote - respond_with @debate - end - - private - - def set_resource - @resource = resource_model.find(params["#{resource_name + "_id"}"]) - end - - def resource_name - @resource_name ||= params[:votable_type] - end - - def resource_model - resource_name.capitalize.constantize - end - - def set_debate - @debate = Debate.find(params[:debate_id]) - end - - def register_vote - @resource.vote_by voter: current_user, vote: params[:value] - end - - def notice - @resource.vote_registered? ? I18n.t("votes.notice_thanks") : I18n.t("votes.notice_already_registered") - end - -end diff --git a/app/views/comments/_votes.html.erb b/app/views/comments/_votes.html.erb index 24b7dd869..2f92ff246 100644 --- a/app/views/comments/_votes.html.erb +++ b/app/views/comments/_votes.html.erb @@ -1,11 +1,11 @@ - <%= link_to "up", debate_comment_votes_path(@debate, comment, value: 'yes'), + <%= link_to "up", vote_comment_path(comment, value: 'yes'), method: "post", remote: true %> <%= comment.get_likes.size %> - <%= link_to "down", debate_comment_votes_path(@debate, comment, value: 'no'), + <%= link_to "down", vote_comment_path(comment, value: 'no'), method: "post", remote: true %> <%= comment.get_dislikes.size %> \ No newline at end of file diff --git a/app/views/comments/vote.js.erb b/app/views/comments/vote.js.erb new file mode 100644 index 000000000..11f0ad905 --- /dev/null +++ b/app/views/comments/vote.js.erb @@ -0,0 +1 @@ +$("#<%= dom_id(@comment) %>_votes").html('<%= j render("comments/votes", comment: @comment) %>'); \ No newline at end of file diff --git a/app/views/debates/_votes.html.erb b/app/views/debates/_votes.html.erb index fd2704ed4..1ed675ef1 100644 --- a/app/views/debates/_votes.html.erb +++ b/app/views/debates/_votes.html.erb @@ -1,6 +1,7 @@
- <%= link_to debate_votes_path(@debate, value: 'yes'), class: 'in-favor', method: "post", remote: true do %> + <%= link_to vote_debate_path(@debate, value: 'yes', partial: 'votes'), + class: 'in-favor', method: "post", remote: true do %> <%= percentage('likes', @debate) %> <% end %> @@ -9,7 +10,8 @@
- <%= link_to debate_votes_path(@debate, value: 'no'), class: 'against', method: "post", remote: true do %> + <%= link_to vote_debate_path(@debate, value: 'no', partial: 'votes'), + class: 'against', method: "post", remote: true do %> <%= percentage('dislikes', @debate) %> <% end %> diff --git a/app/views/debates/vote.js.erb b/app/views/debates/vote.js.erb new file mode 100644 index 000000000..e98725bb2 --- /dev/null +++ b/app/views/debates/vote.js.erb @@ -0,0 +1 @@ +$("#<%= dom_id(@debate) %>_votes").html('<%= j render("debates/#{params[:partial]}", debate: @debate) %>'); \ No newline at end of file diff --git a/app/views/votes/create.js.erb b/app/views/votes/create.js.erb deleted file mode 100644 index 2953d8a25..000000000 --- a/app/views/votes/create.js.erb +++ /dev/null @@ -1,2 +0,0 @@ -$("#<%= dom_id(@resource) %>_votes"). - html('<%= j render("#{@resource_name.pluralize}/votes", comment: @resource) %>'); \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 58e23310d..ce179d8ac 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -7,16 +7,17 @@ Rails.application.routes.draw do # You can have the root of your site routed with "root" root 'debates#index' - concern :votable do |options| - resources :votes, options.merge(only: :create) - end - resources :debates do - concerns :votable, votable_type: 'debate' - - resources :comments, only: :create do - concerns :votable, votable_type: 'comment' + member do + post :vote end + + resources :comments, only: :create, shallow: true do + member do + post :vote + end + end + end resource :account, controller: "account", only: [:show, :update]