comment votes: fix error handling.
Return the comment itself and a standard error response on failure.
This commit is contained in:
@@ -2,20 +2,17 @@ class CommentVotesController < ApplicationController
|
|||||||
respond_to :js, :json, :xml
|
respond_to :js, :json, :xml
|
||||||
before_action :member_only
|
before_action :member_only
|
||||||
skip_before_action :api_check
|
skip_before_action :api_check
|
||||||
|
rescue_with CommentVote::Error, ActiveRecord::RecordInvalid, status: 422
|
||||||
|
|
||||||
def create
|
def create
|
||||||
@comment = Comment.find(params[:comment_id])
|
@comment = Comment.find(params[:comment_id])
|
||||||
@comment_vote = @comment.vote!(params[:score])
|
@comment_vote = @comment.vote!(params[:score])
|
||||||
rescue CommentVote::Error, ActiveRecord::RecordInvalid => x
|
respond_with(@comment)
|
||||||
@error = x
|
|
||||||
render status: 422
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def destroy
|
def destroy
|
||||||
@comment = Comment.find(params[:comment_id])
|
@comment = Comment.find(params[:comment_id])
|
||||||
@comment.unvote!
|
@comment.unvote!
|
||||||
rescue CommentVote::Error => x
|
respond_with(@comment)
|
||||||
@error = x
|
|
||||||
render status: 422
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,8 +1,4 @@
|
|||||||
<% if @error %>
|
<% if @comment_vote.is_negative? %>
|
||||||
Danbooru.error("<%= j @error.to_s %>");
|
|
||||||
<% elsif @comment_vote.errors.any? %>
|
|
||||||
Danbooru.error("<%= j @comment_vote.errors.full_messages.join('; ') %>");
|
|
||||||
<% elsif @comment_vote.is_negative? %>
|
|
||||||
$(".comment[data-comment-id=<%= @comment.id %>]").remove();
|
$(".comment[data-comment-id=<%= @comment.id %>]").remove();
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
<% if @error %>
|
|
||||||
{"success": false, "errors": <%= @error.to_s.to_json.html_safe %>}
|
|
||||||
<% elsif @comment_vote.errors.any? %>
|
|
||||||
{"success": false, "errors": <%= @comment_vote.errors.full_messages.to_json.html_safe %>}
|
|
||||||
<% else %>
|
|
||||||
{"success": true}
|
|
||||||
<% end %>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<% if @comment_vote.errors.any? %>
|
|
||||||
<response success="false"><%= @comment_vote.errors.full_messages.to_json.html_safe %></response>
|
|
||||||
<% else %>
|
|
||||||
<response success="true"/>
|
|
||||||
<% end %>
|
|
||||||
@@ -1,7 +1,3 @@
|
|||||||
<% if @error %>
|
$("#comment-vote-up-link-for-<%= @comment.id %>").show();
|
||||||
Danbooru.error("<%= j @error.to_s %>");
|
$("#comment-vote-down-link-for-<%= @comment.id %>").show();
|
||||||
<% else %>
|
$("#comment-unvote-link-for-<%= @comment.id %>").hide();
|
||||||
$("#comment-vote-up-link-for-<%= @comment.id %>").show();
|
|
||||||
$("#comment-vote-down-link-for-<%= @comment.id %>").show();
|
|
||||||
$("#comment-unvote-link-for-<%= @comment.id %>").hide();
|
|
||||||
<% end %>
|
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
<% if @error %>
|
|
||||||
{"success": false, "reason": <%= @error.to_s.to_json.html_safe %>}
|
|
||||||
<% else %>
|
|
||||||
{"success": true}
|
|
||||||
<% end %>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<% if @error %>
|
|
||||||
<response success="false"><%= @error.to_s %></response>
|
|
||||||
<% else %>
|
|
||||||
<response success="true"/>
|
|
||||||
<% end %>
|
|
||||||
@@ -17,18 +17,24 @@ class CommentVotesControllerTest < ActionDispatch::IntegrationTest
|
|||||||
context "#create.json" do
|
context "#create.json" do
|
||||||
should "create a vote" do
|
should "create a vote" do
|
||||||
assert_difference("CommentVote.count", 1) do
|
assert_difference("CommentVote.count", 1) do
|
||||||
post_auth comment_votes_path(comment_id: @comment.id, format: "json"), @user
|
post_auth comment_votes_path(comment_id: @comment.id, score: "down", format: "json"), @user
|
||||||
assert_response :success
|
assert_response :success
|
||||||
assert_equal("{\"success\": true}", @response.body.strip)
|
|
||||||
|
comment = JSON.parse(@response.body)
|
||||||
|
assert_equal(@comment.id, comment["id"])
|
||||||
|
assert_equal(-1, comment["score"])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
should "fail silently on errors" do
|
should "fail silently on errors" do
|
||||||
create(:comment_vote, comment: @comment, score: -1)
|
create(:comment_vote, comment: @comment, score: -1)
|
||||||
assert_difference("CommentVote.count", 0) do
|
assert_difference("CommentVote.count", 0) do
|
||||||
post_auth comment_votes_path(comment_id: @comment.id, score: "-1", format: "json"), @user
|
post_auth comment_votes_path(comment_id: @comment.id, score: "down", format: "json"), @user
|
||||||
assert_response 422
|
assert_response 422
|
||||||
assert_equal("{\"success\": false, \"errors\": \"Validation failed: You have already voted for this comment\"}", @response.body.strip)
|
|
||||||
|
comment = JSON.parse(@response.body)
|
||||||
|
assert_equal(false, comment["success"])
|
||||||
|
assert_equal("Validation failed: You have already voted for this comment", comment["message"])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -36,7 +42,7 @@ class CommentVotesControllerTest < ActionDispatch::IntegrationTest
|
|||||||
context "#create.js" do
|
context "#create.js" do
|
||||||
should "create a vote" do
|
should "create a vote" do
|
||||||
assert_difference("CommentVote.count", 1) do
|
assert_difference("CommentVote.count", 1) do
|
||||||
post_auth comment_votes_path(comment_id: @comment.id, format: "json", score: 1), @user
|
post_auth comment_votes_path(comment_id: @comment.id, format: "json", score: "down"), @user
|
||||||
assert_response :success
|
assert_response :success
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -44,7 +50,7 @@ class CommentVotesControllerTest < ActionDispatch::IntegrationTest
|
|||||||
should "fail on errors" do
|
should "fail on errors" do
|
||||||
create(:comment_vote, :comment => @comment, :score => -1)
|
create(:comment_vote, :comment => @comment, :score => -1)
|
||||||
assert_difference("CommentVote.count", 0) do
|
assert_difference("CommentVote.count", 0) do
|
||||||
post_auth comment_votes_path(comment_id: @comment.id, :score => -1, format: "js"), @user
|
post_auth comment_votes_path(comment_id: @comment.id, :score => "down", format: "js"), @user
|
||||||
assert_response 422
|
assert_response 422
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user