refactors voted debates
This commit is contained in:
@@ -37,7 +37,7 @@ class ApplicationController < ActionController::Base
|
||||
end
|
||||
end
|
||||
|
||||
def set_voted_values(debates_ids)
|
||||
@voted_values = current_user ? current_user.votes_on_debates(debates_ids) : {}
|
||||
def set_debate_votes(debates)
|
||||
@voted_values = current_user ? current_user.debate_votes(debates) : {}
|
||||
end
|
||||
end
|
||||
|
||||
@@ -3,17 +3,12 @@ class DebatesController < ApplicationController
|
||||
load_and_authorize_resource
|
||||
|
||||
def index
|
||||
if params[:tag]
|
||||
@debates = Debate.tagged_with(params[:tag]).order(id: :desc)
|
||||
set_voted_values @debates.map(&:id)
|
||||
else
|
||||
@debates = Debate.all.order(id: :desc)
|
||||
set_voted_values @debates.map(&:id)
|
||||
end
|
||||
@debates = Debate.search(params)
|
||||
set_debate_votes(@debates)
|
||||
end
|
||||
|
||||
def show
|
||||
set_voted_values [@debate.id]
|
||||
set_debate_votes(@debate)
|
||||
end
|
||||
|
||||
def new
|
||||
@@ -40,7 +35,7 @@ class DebatesController < ApplicationController
|
||||
|
||||
def vote
|
||||
@debate.vote_by(voter: current_user, vote: params[:value])
|
||||
set_voted_values [@debate.id]
|
||||
set_debate_votes(@debate)
|
||||
end
|
||||
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@ class WelcomeController < ApplicationController
|
||||
skip_authorization_check
|
||||
|
||||
def index
|
||||
@featured_debates = Debate.order("created_at DESC").limit(9)
|
||||
set_voted_values @featured_debates.map(&:id)
|
||||
@featured_debates = Debate.limit(9)
|
||||
set_debate_votes(@featured_debates)
|
||||
end
|
||||
|
||||
end
|
||||
@@ -13,12 +13,9 @@ class User < ActiveRecord::Base
|
||||
use_nickname? ? nickname : "#{first_name} #{last_name}"
|
||||
end
|
||||
|
||||
def votes_on_debates(debates_ids = [])
|
||||
debates_ids = debates_ids.flatten.compact.uniq
|
||||
return {} if debates_ids.empty?
|
||||
|
||||
voted = votes.where("votable_type = ? AND votable_id IN (?)", "Debate", debates_ids)
|
||||
voted.each_with_object({}){ |v,_| _[v.votable_id] = v.vote_flag }
|
||||
def debate_votes(debates)
|
||||
voted = votes.for_debates.in(debates)
|
||||
voted.each_with_object({}) { |v,_| _[v.votable_id] = v.value }
|
||||
end
|
||||
|
||||
def administrator?
|
||||
|
||||
13
config/initializers/vote_extensions.rb
Normal file
13
config/initializers/vote_extensions.rb
Normal file
@@ -0,0 +1,13 @@
|
||||
ActsAsVotable::Vote.class_eval do
|
||||
def self.for_debates
|
||||
where(votable_type: 'Debate')
|
||||
end
|
||||
|
||||
def self.in(debates)
|
||||
where(votable_id: debates)
|
||||
end
|
||||
|
||||
def value
|
||||
vote_flag
|
||||
end
|
||||
end
|
||||
@@ -2,13 +2,11 @@ require 'rails_helper'
|
||||
|
||||
describe User do
|
||||
|
||||
describe "#votes_on_debates" do
|
||||
describe "#debate_votes" do
|
||||
let(:user) { create(:user) }
|
||||
|
||||
it "returns {} if no debate" do
|
||||
expect(user.votes_on_debates()).to eq({})
|
||||
expect(user.votes_on_debates([])).to eq({})
|
||||
expect(user.votes_on_debates([nil, nil])).to eq({})
|
||||
expect(user.debate_votes([])).to eq({})
|
||||
end
|
||||
|
||||
it "returns a hash of debates ids and votes" do
|
||||
@@ -18,7 +16,7 @@ describe User do
|
||||
create(:vote, voter: user, votable: debate1, vote_flag: true)
|
||||
create(:vote, voter: user, votable: debate3, vote_flag: false)
|
||||
|
||||
voted = user.votes_on_debates([debate1.id, debate2.id, debate3.id])
|
||||
voted = user.debate_votes([debate1, debate2, debate3])
|
||||
|
||||
expect(voted[debate1.id]).to eq(true)
|
||||
expect(voted[debate2.id]).to eq(nil)
|
||||
|
||||
46
spec/models/vote_spec.rb
Normal file
46
spec/models/vote_spec.rb
Normal file
@@ -0,0 +1,46 @@
|
||||
require 'rails_helper'
|
||||
|
||||
describe 'Vote' do
|
||||
|
||||
describe '#for_debates' do
|
||||
it 'returns votes for debates' do
|
||||
debate = create(:debate)
|
||||
create(:vote, votable: debate)
|
||||
|
||||
expect(Vote.for_debates.count).to eq(1)
|
||||
end
|
||||
|
||||
it 'does not returns votes for other votables' do
|
||||
comment = create(:comment)
|
||||
create(:vote, votable: comment)
|
||||
|
||||
expect(Vote.for_debates.count).to eq(0)
|
||||
end
|
||||
end
|
||||
|
||||
describe '#in' do
|
||||
it 'returns debates send in parameters' do
|
||||
debate = create(:debate)
|
||||
create(:vote, votable: debate)
|
||||
|
||||
expect(Vote.in(debate).count).to eq(1)
|
||||
end
|
||||
|
||||
it 'does not return debates not in parameters' do
|
||||
debate = create(:debate)
|
||||
create(:vote, votable: debate)
|
||||
|
||||
expect(Vote.in([]).count).to eq(0)
|
||||
end
|
||||
end
|
||||
|
||||
describe '#value' do
|
||||
it 'returns vote flag' do
|
||||
vote = create(:vote, vote_flag: true)
|
||||
expect(vote.value).to eq(true)
|
||||
|
||||
vote = create(:vote, vote_flag: false)
|
||||
expect(vote.value).to eq(false)
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user