adds moderation to comments and debates [#136]
This commit is contained in:
@@ -1,8 +1,11 @@
|
|||||||
App.Comments =
|
App.Comments =
|
||||||
|
|
||||||
add_response: (parent_id, response_html) ->
|
add_comment: (parent_id, response_html) ->
|
||||||
$(response_html).insertAfter($("#js-comment-form-#{parent_id}"))
|
$(response_html).insertAfter($("#js-comment-form-#{parent_id}"))
|
||||||
|
|
||||||
|
add_reply: (parent_id, response_html) ->
|
||||||
|
$("##{parent_id} .comment-children:first").prepend($(response_html))
|
||||||
|
|
||||||
display_error: (field_with_errors, error_html) ->
|
display_error: (field_with_errors, error_html) ->
|
||||||
$(error_html).insertAfter($("#{field_with_errors}"))
|
$(error_html).insertAfter($("#{field_with_errors}"))
|
||||||
|
|
||||||
|
|||||||
7
app/assets/javascripts/moderator_comment.js.coffee
Normal file
7
app/assets/javascripts/moderator_comment.js.coffee
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
App.ModeratorComments =
|
||||||
|
|
||||||
|
add_class_faded: (id) ->
|
||||||
|
$("##{id} .comment-body:first").addClass("faded")
|
||||||
|
|
||||||
|
hide_moderator_actions: (id) ->
|
||||||
|
$("##{id} #moderator-comment-actions:first").hide()
|
||||||
8
app/assets/javascripts/moderator_debates.js.coffee
Normal file
8
app/assets/javascripts/moderator_debates.js.coffee
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
App.ModeratorDebates =
|
||||||
|
|
||||||
|
add_class_faded: (id) ->
|
||||||
|
$("##{id}").addClass("faded")
|
||||||
|
$("#comments").addClass("faded")
|
||||||
|
|
||||||
|
hide_moderator_actions: (id) ->
|
||||||
|
$("##{id} #moderator-debate-actions:first").hide()
|
||||||
@@ -571,4 +571,9 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.faded {
|
||||||
|
opacity: 0.4;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
class Admin::BaseController < ApplicationController
|
class Admin::BaseController < ApplicationController
|
||||||
|
layout 'admin'
|
||||||
before_action :authenticate_user!
|
before_action :authenticate_user!
|
||||||
|
|
||||||
skip_authorization_check
|
skip_authorization_check
|
||||||
|
|||||||
13
app/controllers/admin/comments_controller.rb
Normal file
13
app/controllers/admin/comments_controller.rb
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
class Admin::CommentsController < Admin::BaseController
|
||||||
|
|
||||||
|
def index
|
||||||
|
@comments = Comment.only_hidden
|
||||||
|
end
|
||||||
|
|
||||||
|
def restore
|
||||||
|
@comment = Comment.with_hidden.find(params[:id])
|
||||||
|
@comment.restore
|
||||||
|
redirect_to admin_comments_path, notice: t('admin.comments.restore.success')
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
16
app/controllers/admin/debates_controller.rb
Normal file
16
app/controllers/admin/debates_controller.rb
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
class Admin::DebatesController < Admin::BaseController
|
||||||
|
|
||||||
|
def index
|
||||||
|
@debates = Debate.only_hidden
|
||||||
|
end
|
||||||
|
|
||||||
|
def show
|
||||||
|
@debate = Debate.with_hidden.find(params[:id])
|
||||||
|
end
|
||||||
|
|
||||||
|
def restore
|
||||||
|
@debate = Debate.with_hidden.find(params[:id])
|
||||||
|
@debate.restore
|
||||||
|
redirect_to admin_debates_path, notice: t('admin.debates.restore.success')
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -2,6 +2,7 @@ class CommentsController < ApplicationController
|
|||||||
before_action :authenticate_user!
|
before_action :authenticate_user!
|
||||||
before_action :build_comment, only: :create
|
before_action :build_comment, only: :create
|
||||||
before_action :parent, only: :create
|
before_action :parent, only: :create
|
||||||
|
|
||||||
load_and_authorize_resource
|
load_and_authorize_resource
|
||||||
respond_to :html, :js
|
respond_to :html, :js
|
||||||
|
|
||||||
@@ -50,4 +51,5 @@ class CommentsController < ApplicationController
|
|||||||
def email_on_comment_reply?
|
def email_on_comment_reply?
|
||||||
reply? && parent.author.email_on_comment_reply?
|
reply? && parent.author.email_on_comment_reply?
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
class DebatesController < ApplicationController
|
class DebatesController < ApplicationController
|
||||||
before_action :authenticate_user!, except: [:index, :show]
|
before_action :authenticate_user!, except: [:index, :show]
|
||||||
|
|
||||||
load_and_authorize_resource
|
load_and_authorize_resource
|
||||||
|
respond_to :html, :js
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@debates = Debate.search(params)
|
@debates = Debate.search(params)
|
||||||
@@ -9,6 +11,7 @@ class DebatesController < ApplicationController
|
|||||||
|
|
||||||
def show
|
def show
|
||||||
set_debate_votes(@debate)
|
set_debate_votes(@debate)
|
||||||
|
@comments = @debate.root_comments.with_hidden.recent
|
||||||
end
|
end
|
||||||
|
|
||||||
def new
|
def new
|
||||||
@@ -46,7 +49,6 @@ class DebatesController < ApplicationController
|
|||||||
set_debate_votes(@debate)
|
set_debate_votes(@debate)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def debate_params
|
def debate_params
|
||||||
|
|||||||
8
app/controllers/moderation/comments_controller.rb
Normal file
8
app/controllers/moderation/comments_controller.rb
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
class Moderation::CommentsController < Moderation::BaseController
|
||||||
|
|
||||||
|
def hide
|
||||||
|
@comment = Comment.find(params[:id])
|
||||||
|
@comment.hide
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
7
app/controllers/moderation/debates_controller.rb
Normal file
7
app/controllers/moderation/debates_controller.rb
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
class Moderation::DebatesController < Moderation::BaseController
|
||||||
|
|
||||||
|
def hide
|
||||||
|
@debate = Debate.find(params[:id])
|
||||||
|
@debate.hide
|
||||||
|
end
|
||||||
|
end
|
||||||
7
app/helpers/abilities_helper.rb
Normal file
7
app/helpers/abilities_helper.rb
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
module AbilitiesHelper
|
||||||
|
|
||||||
|
def moderator?
|
||||||
|
current_user.try(:moderator?)
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
@@ -15,10 +15,13 @@ class Ability
|
|||||||
|
|
||||||
can [:create, :vote], Comment
|
can [:create, :vote], Comment
|
||||||
|
|
||||||
if user.moderator? or user.administrator?
|
if user.moderator?
|
||||||
|
can [:hide], Comment
|
||||||
|
can [:hide], Debate
|
||||||
|
|
||||||
elsif user.administrator?
|
elsif user.administrator?
|
||||||
|
can [:restore], Comment
|
||||||
|
can [:restore], Debate
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
class Comment < ActiveRecord::Base
|
class Comment < ActiveRecord::Base
|
||||||
|
include ActsAsParanoidAliases
|
||||||
acts_as_nested_set scope: [:commentable_id, :commentable_type], counter_cache: :children_count
|
acts_as_nested_set scope: [:commentable_id, :commentable_type], counter_cache: :children_count
|
||||||
|
|
||||||
|
acts_as_paranoid column: :hidden_at
|
||||||
acts_as_votable
|
acts_as_votable
|
||||||
|
|
||||||
validates :body, presence: true
|
validates :body, presence: true
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
require 'numeric'
|
require 'numeric'
|
||||||
class Debate < ActiveRecord::Base
|
class Debate < ActiveRecord::Base
|
||||||
|
include ActsAsParanoidAliases
|
||||||
default_scope { order('created_at DESC') }
|
default_scope { order('created_at DESC') }
|
||||||
|
|
||||||
apply_simple_captcha
|
apply_simple_captcha
|
||||||
@@ -8,6 +9,7 @@ class Debate < ActiveRecord::Base
|
|||||||
acts_as_votable
|
acts_as_votable
|
||||||
acts_as_commentable
|
acts_as_commentable
|
||||||
acts_as_taggable
|
acts_as_taggable
|
||||||
|
acts_as_paranoid column: :hidden_at
|
||||||
|
|
||||||
belongs_to :author, class_name: 'User', foreign_key: 'author_id'
|
belongs_to :author, class_name: 'User', foreign_key: 'author_id'
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
<div id="admin_menu">
|
<ul id="admin_menu">
|
||||||
<%= link_to t('admin.tags.index.title'), admin_tags_path %>
|
<li><%= link_to t('admin.menu.debate_topics'), admin_tags_path %></li>
|
||||||
</div>
|
<li><%= link_to t('admin.menu.hidden_debates'), admin_debates_path %></li>
|
||||||
|
<li><%= link_to t('admin.menu.hidden_comments'), admin_comments_path %></li>
|
||||||
|
</ul>
|
||||||
|
|||||||
14
app/views/admin/comments/index.html.erb
Normal file
14
app/views/admin/comments/index.html.erb
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<div class="left">
|
||||||
|
<h1><%= t("admin.comments.index.title") %></h1>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<% @comments.each do |comment| %>
|
||||||
|
<li id="<%= dom_id(comment) %>">
|
||||||
|
<%= comment.body %>
|
||||||
|
|
||||||
|
<%= link_to t("admin.actions.restore"), restore_admin_comment_path(comment),
|
||||||
|
method: :put, data: { confirm: t("admin.actions.confirm") } %>
|
||||||
|
</li>
|
||||||
|
<% end %>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
13
app/views/admin/debates/index.html.erb
Normal file
13
app/views/admin/debates/index.html.erb
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<div class="left">
|
||||||
|
<h1><%= t("admin.debates.index.title") %></h1>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<% @debates.each do |debate| %>
|
||||||
|
<%= link_to admin_debate_path(debate) do %>
|
||||||
|
<li id="<%= dom_id(debate) %>">
|
||||||
|
<%= link_to debate.title, admin_debate_path(debate) %>
|
||||||
|
</li>
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
13
app/views/admin/debates/show.html.erb
Normal file
13
app/views/admin/debates/show.html.erb
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<div class="left">
|
||||||
|
<h1><%= t("admin.debates.index.title") %></h1>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<div><%= @debate.title %></div>
|
||||||
|
<div><%= @debate.description %></div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<%= link_to t('admin.actions.restore'), restore_admin_debate_path(@debate),
|
||||||
|
method: :put, data: { confirm: t('admin.actions.confirm') } %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
5
app/views/comments/_actions.html.erb
Normal file
5
app/views/comments/_actions.html.erb
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<span id="moderator-comment-actions">
|
||||||
|
|
|
||||||
|
<%= link_to t("admin.actions.hide").capitalize, hide_moderation_comment_path(comment),
|
||||||
|
method: :put, remote: true, data: { confirm: t('admin.actions.confirm') } %>
|
||||||
|
</span>
|
||||||
@@ -1,30 +1,44 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div id="comment-<%= comment.id %>" class="comment small-12 column">
|
<div id="<%= dom_id(comment) %>" class="comment small-12 column">
|
||||||
|
|
||||||
<%= avatar_image(comment.user, size: 32, class: 'left') %>
|
<% if comment.hidden? %>
|
||||||
|
This comment has been deleted
|
||||||
|
<% else %>
|
||||||
|
|
||||||
<div class="comment-body">
|
<%= avatar_image(comment.user, size: 32, class: 'left') %>
|
||||||
<span class="comment-info">
|
|
||||||
<span><%= comment.user.name %></span> • <%= time_ago_in_words(comment.created_at) %>
|
|
||||||
</span>
|
|
||||||
<p><%= comment.body %></p>
|
|
||||||
|
|
||||||
<span id="<%= dom_id(comment) %>_votes" class="comment-votes right">
|
<div class="comment-body">
|
||||||
<%= render 'comments/votes', comment: comment %>
|
<span class="comment-info">
|
||||||
</span>
|
<span><%= comment.user.name %></span> • <%= time_ago_in_words(comment.created_at) %>
|
||||||
|
</span>
|
||||||
|
<p><%= comment.body %></p>
|
||||||
|
|
||||||
<p class="reply">
|
<span id="<%= dom_id(comment) %>_votes" class="comment-votes right">
|
||||||
<%= t("debates.comment.responses", count: comment.children_count) %>
|
<%= render 'comments/votes', comment: comment %>
|
||||||
<% if user_signed_in? %>
|
</span>
|
||||||
|
|
|
||||||
<%= render 'comments/form', {parent: comment, toggeable: true} %>
|
|
||||||
<% end %>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="comment-children">
|
<p class="reply">
|
||||||
<%= render comment.children.reorder('id DESC, lft') %>
|
<%= t("debates.comment.responses", count: comment.children_count) %>
|
||||||
</div>
|
|
||||||
|
<% if user_signed_in? %>
|
||||||
|
|
|
||||||
|
<%= link_to(comment_link_text(comment), "",
|
||||||
|
class: "js-add-comment-link", data: {'id': dom_id(comment)}) %>
|
||||||
|
|
||||||
|
<% if moderator? %>
|
||||||
|
<%= render 'comments/actions', comment: comment %>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<%= render 'comments/form', {parent: comment, toggeable: true} %>
|
||||||
|
<% end %>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<div class="comment-children">
|
||||||
|
<%= render comment.children.with_deleted.reorder('id DESC, lft') %>
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -1,5 +1,3 @@
|
|||||||
<%= link_to(comment_link_text(parent), "", class: "js-add-comment-link", data: {'id': dom_id(parent)}) if toggeable %>
|
|
||||||
|
|
||||||
<div id="js-comment-form-<%= dom_id(parent) %>" <%= "style='display:none'".html_safe if toggeable %>>
|
<div id="js-comment-form-<%= dom_id(parent) %>" <%= "style='display:none'".html_safe if toggeable %>>
|
||||||
<%= form_for [@debate, Comment.new], remote: true do |f| %>
|
<%= form_for [@debate, Comment.new], remote: true do |f| %>
|
||||||
<%= f.text_area :body %>
|
<%= f.text_area :body %>
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
var parent_id = '<%= dom_id(@parent) %>';
|
var parent_id = "<%= dom_id(@parent) %>";
|
||||||
|
var comment_html = "<%= j(render @comment) %>"
|
||||||
|
|
||||||
<% if @parent.is_a?(Debate) -%>
|
<% if @parent.is_a?(Debate) -%>
|
||||||
App.Comments.reset_form(parent_id);
|
App.Comments.reset_form(parent_id);
|
||||||
|
App.Comments.add_comment(parent_id, comment_html);
|
||||||
<% else -%>
|
<% else -%>
|
||||||
App.Comments.reset_and_hide_form(parent_id);
|
App.Comments.reset_and_hide_form(parent_id);
|
||||||
|
App.Comments.add_reply(parent_id, comment_html);
|
||||||
<% end -%>
|
<% end -%>
|
||||||
|
|
||||||
App.Comments.add_response(parent_id, "<%= j(render @comment) %>");
|
|
||||||
|
|||||||
2
app/views/debates/_actions.html.erb
Normal file
2
app/views/debates/_actions.html.erb
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
<%= link_to t("admin.actions.hide").capitalize, hide_moderation_debate_path(debate),
|
||||||
|
method: :put, remote: true, data: { confirm: t('admin.actions.confirm') } %>
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
<section class="debate-show">
|
<section class="debate-show">
|
||||||
<div id="debate-<%= @debate.id %>" class="row">
|
<div id="<%= dom_id(@debate) %>" class="row">
|
||||||
<div class="small-12 medium-9 column">
|
<div class="small-12 medium-9 column">
|
||||||
<i class="icon-angle-left left"></i> <%= link_to t("debates.show.back_link"), debates_path, class: 'left back' %>
|
<i class="icon-angle-left left"></i> <%= link_to t("debates.show.back_link"), debates_path, class: 'left back' %>
|
||||||
|
|
||||||
@@ -21,12 +21,19 @@
|
|||||||
<span class="bullet"> • </span>
|
<span class="bullet"> • </span>
|
||||||
<%= l @debate.created_at.to_date %>
|
<%= l @debate.created_at.to_date %>
|
||||||
<span class="bullet"> • </span>
|
<span class="bullet"> • </span>
|
||||||
<i class="icon-chat-bubble-two"></i> <%= link_to t("debates.show.comments", count: @debate.comment_threads.count), "#comments" %>
|
<i class="icon-chat-bubble-two"></i>
|
||||||
|
<%= link_to t("debates.show.comments", count: @debate.comment_threads.count), "#comments" %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<%= @debate.description %>
|
<%= @debate.description %>
|
||||||
|
|
||||||
<%= render 'shared/tags', debate: @debate %>
|
<%= render 'shared/tags', debate: @debate %>
|
||||||
|
|
||||||
|
<% if moderator? %>
|
||||||
|
<div id='moderator-debate-actions'>
|
||||||
|
<%= render 'actions', debate: @debate %>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<aside class="small-12 medium-3 column">
|
<aside class="small-12 medium-3 column">
|
||||||
@@ -40,7 +47,8 @@
|
|||||||
<div class="sidebar-divider"></div>
|
<div class="sidebar-divider"></div>
|
||||||
<h3><%= t("debates.show.share") %></h3>
|
<h3><%= t("debates.show.share") %></h3>
|
||||||
<%= social_share_button_tag(@debate.title) %>
|
<%= social_share_button_tag(@debate.title) %>
|
||||||
<% if user_signed_in? %>
|
|
||||||
|
<% if user_signed_in? %>
|
||||||
<%= link_to t("debates.show.leave_comment"), "#comments", class: "leave-comment" %>
|
<%= link_to t("debates.show.leave_comment"), "#comments", class: "leave-comment" %>
|
||||||
<% else %>
|
<% else %>
|
||||||
<%= link_to t("debates.show.login_to_comment"), new_user_session_path, class: "leave-comment" %>
|
<%= link_to t("debates.show.login_to_comment"), new_user_session_path, class: "leave-comment" %>
|
||||||
@@ -63,7 +71,8 @@
|
|||||||
<%= render 'comments/form', {parent: @debate, toggeable: false} %>
|
<%= render 'comments/form', {parent: @debate, toggeable: false} %>
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
<%= render @debate.root_comments.recent %>
|
|
||||||
|
<%= render @comments %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|||||||
3
app/views/moderation/comments/hide.js.erb
Normal file
3
app/views/moderation/comments/hide.js.erb
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
var comment_id = '<%= dom_id(@comment) %>';
|
||||||
|
App.ModeratorComments.add_class_faded(comment_id);
|
||||||
|
App.ModeratorComments.hide_moderator_actions(comment_id);
|
||||||
3
app/views/moderation/debates/hide.js.erb
Normal file
3
app/views/moderation/debates/hide.js.erb
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
var debate_id = '<%= dom_id(@debate) %>';
|
||||||
|
App.ModeratorDebates.add_class_faded(debate_id);
|
||||||
|
App.ModeratorDebates.hide_moderator_actions(debate_id);
|
||||||
@@ -3,6 +3,14 @@ en:
|
|||||||
dashboard:
|
dashboard:
|
||||||
index:
|
index:
|
||||||
title: Administration
|
title: Administration
|
||||||
|
menu:
|
||||||
|
debate_topics: Debate topics
|
||||||
|
hidden_debates: Hidden debates
|
||||||
|
hidden_comments: Hidden comments
|
||||||
|
actions:
|
||||||
|
hide: Hide
|
||||||
|
restore: Restore
|
||||||
|
confirm: 'Are you sure?'
|
||||||
tags:
|
tags:
|
||||||
index:
|
index:
|
||||||
title: 'Debate topics'
|
title: 'Debate topics'
|
||||||
@@ -11,3 +19,14 @@ en:
|
|||||||
name:
|
name:
|
||||||
placeholder: 'Write a topic'
|
placeholder: 'Write a topic'
|
||||||
destroy: Delete Tag
|
destroy: Delete Tag
|
||||||
|
comments:
|
||||||
|
index:
|
||||||
|
title: Hidden comments
|
||||||
|
restore:
|
||||||
|
success: The comment has been restored
|
||||||
|
debates:
|
||||||
|
index:
|
||||||
|
title: Hidden debates
|
||||||
|
restore:
|
||||||
|
success: The debate has been restored
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,14 @@ es:
|
|||||||
dashboard:
|
dashboard:
|
||||||
index:
|
index:
|
||||||
title: Administración
|
title: Administración
|
||||||
|
menu:
|
||||||
|
debate_topics: Temas de debate
|
||||||
|
hidden_debates: Debates ocultos
|
||||||
|
hidden_comments: Comentarios ocultos
|
||||||
|
actions:
|
||||||
|
hide: Ocultar
|
||||||
|
restore: Permitir
|
||||||
|
confirm: '¿Estás seguro?'
|
||||||
tags:
|
tags:
|
||||||
index:
|
index:
|
||||||
title: 'Temas de debate'
|
title: 'Temas de debate'
|
||||||
@@ -11,3 +19,13 @@ es:
|
|||||||
name:
|
name:
|
||||||
placeholder: 'Escribe el nombre del tema'
|
placeholder: 'Escribe el nombre del tema'
|
||||||
destroy: Elimina la etiqueta
|
destroy: Elimina la etiqueta
|
||||||
|
comments:
|
||||||
|
index:
|
||||||
|
title: Comentarios ocultos
|
||||||
|
restore:
|
||||||
|
success: El comentario ha sido permitido
|
||||||
|
debates:
|
||||||
|
index:
|
||||||
|
title: Debates ocultos
|
||||||
|
restore:
|
||||||
|
success: El debate ha sido permitido
|
||||||
|
|||||||
@@ -8,14 +8,10 @@ Rails.application.routes.draw do
|
|||||||
root 'welcome#index'
|
root 'welcome#index'
|
||||||
|
|
||||||
resources :debates do
|
resources :debates do
|
||||||
member do
|
member { post :vote }
|
||||||
post :vote
|
|
||||||
end
|
|
||||||
|
|
||||||
resources :comments, only: :create, shallow: true do
|
resources :comments, only: :create, shallow: true do
|
||||||
member do
|
member { post :vote }
|
||||||
post :vote
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -24,11 +20,27 @@ Rails.application.routes.draw do
|
|||||||
namespace :admin do
|
namespace :admin do
|
||||||
root to: "dashboard#index"
|
root to: "dashboard#index"
|
||||||
|
|
||||||
|
resources :debates, only: [:index, :show] do
|
||||||
|
member { put :restore }
|
||||||
|
end
|
||||||
|
|
||||||
|
resources :comments, only: :index do
|
||||||
|
member { put :restore }
|
||||||
|
end
|
||||||
|
|
||||||
resources :tags, only: [:index, :create, :update, :destroy]
|
resources :tags, only: [:index, :create, :update, :destroy]
|
||||||
end
|
end
|
||||||
|
|
||||||
namespace :moderation do
|
namespace :moderation do
|
||||||
root to: "dashboard#index"
|
root to: "dashboard#index"
|
||||||
|
|
||||||
|
resources :debates, only: [] do
|
||||||
|
member { put :hide }
|
||||||
|
end
|
||||||
|
|
||||||
|
resources :comments, only: [:index] do
|
||||||
|
member { put :hide }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Example of regular route:
|
# Example of regular route:
|
||||||
|
|||||||
6
db/migrate/20150810201448_add_hidden_at_to_comments.rb
Normal file
6
db/migrate/20150810201448_add_hidden_at_to_comments.rb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
class AddHiddenAtToComments < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
add_column :comments, :hidden_at, :datetime
|
||||||
|
add_index :comments, :hidden_at
|
||||||
|
end
|
||||||
|
end
|
||||||
6
db/migrate/20150811145628_add_hidden_at_to_debates.rb
Normal file
6
db/migrate/20150811145628_add_hidden_at_to_debates.rb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
class AddHiddenAtToDebates < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
add_column :debates, :hidden_at, :datetime
|
||||||
|
add_index :debates, :hidden_at
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -12,7 +12,6 @@
|
|||||||
# It's strongly recommended that you check this file into your version control system.
|
# It's strongly recommended that you check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema.define(version: 20150815154430) do
|
ActiveRecord::Schema.define(version: 20150815154430) do
|
||||||
|
|
||||||
# These are extensions that must be enabled in order to support this database
|
# These are extensions that must be enabled in order to support this database
|
||||||
enable_extension "plpgsql"
|
enable_extension "plpgsql"
|
||||||
|
|
||||||
@@ -35,9 +34,11 @@ ActiveRecord::Schema.define(version: 20150815154430) do
|
|||||||
t.datetime "created_at"
|
t.datetime "created_at"
|
||||||
t.datetime "updated_at"
|
t.datetime "updated_at"
|
||||||
t.integer "children_count", default: 0
|
t.integer "children_count", default: 0
|
||||||
|
t.datetime "hidden_at"
|
||||||
end
|
end
|
||||||
|
|
||||||
add_index "comments", ["commentable_id", "commentable_type"], name: "index_comments_on_commentable_id_and_commentable_type", using: :btree
|
add_index "comments", ["commentable_id", "commentable_type"], name: "index_comments_on_commentable_id_and_commentable_type", using: :btree
|
||||||
|
add_index "comments", ["hidden_at"], name: "index_comments_on_hidden_at", using: :btree
|
||||||
add_index "comments", ["user_id"], name: "index_comments_on_user_id", using: :btree
|
add_index "comments", ["user_id"], name: "index_comments_on_user_id", using: :btree
|
||||||
|
|
||||||
create_table "debates", force: :cascade do |t|
|
create_table "debates", force: :cascade do |t|
|
||||||
@@ -46,8 +47,11 @@ ActiveRecord::Schema.define(version: 20150815154430) do
|
|||||||
t.integer "author_id"
|
t.integer "author_id"
|
||||||
t.datetime "created_at", null: false
|
t.datetime "created_at", null: false
|
||||||
t.datetime "updated_at", null: false
|
t.datetime "updated_at", null: false
|
||||||
|
t.datetime "hidden_at"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
add_index "debates", ["hidden_at"], name: "index_debates_on_hidden_at", using: :btree
|
||||||
|
|
||||||
create_table "moderators", force: :cascade do |t|
|
create_table "moderators", force: :cascade do |t|
|
||||||
t.integer "user_id"
|
t.integer "user_id"
|
||||||
end
|
end
|
||||||
|
|||||||
33
lib/acts_as_paranoid_aliases.rb
Normal file
33
lib/acts_as_paranoid_aliases.rb
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
module ActsAsParanoidAliases
|
||||||
|
|
||||||
|
def self.included(base)
|
||||||
|
base.extend(ClassMethods)
|
||||||
|
|
||||||
|
def viewable?
|
||||||
|
not deleted?
|
||||||
|
end
|
||||||
|
|
||||||
|
def hide
|
||||||
|
update_attribute(:hidden_at, Time.now)
|
||||||
|
end
|
||||||
|
|
||||||
|
def hidden?
|
||||||
|
deleted?
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
module ClassMethods
|
||||||
|
def with_hidden
|
||||||
|
with_deleted
|
||||||
|
end
|
||||||
|
|
||||||
|
def only_hidden
|
||||||
|
only_deleted
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
module ActsAsParanoid
|
||||||
|
include ActsAsParanoidAliases
|
||||||
|
end
|
||||||
@@ -4,6 +4,7 @@ require 'cancan/matchers'
|
|||||||
describe Ability do
|
describe Ability do
|
||||||
subject(:ability) { Ability.new(user) }
|
subject(:ability) { Ability.new(user) }
|
||||||
let(:debate) { Debate.new }
|
let(:debate) { Debate.new }
|
||||||
|
let(:comment) { create(:comment) }
|
||||||
|
|
||||||
describe "Non-logged in user" do
|
describe "Non-logged in user" do
|
||||||
let(:user) { nil }
|
let(:user) { nil }
|
||||||
@@ -53,6 +54,11 @@ describe Ability do
|
|||||||
it { should be_able_to(:show, debate) }
|
it { should be_able_to(:show, debate) }
|
||||||
it { should be_able_to(:vote, debate) }
|
it { should be_able_to(:vote, debate) }
|
||||||
|
|
||||||
|
it { should be_able_to(:hide, comment) }
|
||||||
|
it { should be_able_to(:hide, debate) }
|
||||||
|
|
||||||
|
it { should_not be_able_to(:restore, comment) }
|
||||||
|
it { should_not be_able_to(:restore, debate) }
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "Administrator" do
|
describe "Administrator" do
|
||||||
@@ -63,5 +69,7 @@ describe Ability do
|
|||||||
it { should be_able_to(:show, debate) }
|
it { should be_able_to(:show, debate) }
|
||||||
it { should be_able_to(:vote, debate) }
|
it { should be_able_to(:vote, debate) }
|
||||||
|
|
||||||
|
it { should be_able_to(:restore, comment) }
|
||||||
|
it { should be_able_to(:restore, debate) }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user