svn commit: r264570 - user/des/fbp/lib/FBP/Controller

Dag-Erling Smørgrav des at FreeBSD.org
Wed Apr 16 22:18:44 UTC 2014


Author: des
Date: Wed Apr 16 22:18:43 2014
New Revision: 264570
URL: http://svnweb.freebsd.org/changeset/base/264570

Log:
  Fix the question validation logic, which was broken by Perl's
  insistence on localizing loop variables.

Modified:
  user/des/fbp/lib/FBP/Controller/Poll.pm

Modified: user/des/fbp/lib/FBP/Controller/Poll.pm
==============================================================================
--- user/des/fbp/lib/FBP/Controller/Poll.pm	Wed Apr 16 22:04:09 2014	(r264569)
+++ user/des/fbp/lib/FBP/Controller/Poll.pm	Wed Apr 16 22:18:43 2014	(r264570)
@@ -57,8 +57,9 @@ sub see :Chained('poll') :PathPart('') :
     my ($self, $c) = @_;
 
     my $poll = $c->stash->{poll};
-    $c->stash(questions => $poll->questions->
-	      search_rs(undef, { order_by => { -asc => 'rank' } }));
+    my $questions = $poll->questions->
+	search(undef, { order_by => { -asc => 'rank' } });
+    $c->stash(questions => $questions);
 }
 
 =head2 vote
@@ -73,7 +74,8 @@ sub vote :Chained('poll') :Path :Args(0)
     # Retrieve the poll and its list of questions
     my $poll = $c->stash->{poll};
     my $pid = $poll->id;
-    my $questions = $poll->questions;
+    my $questions = $poll->questions->
+	search(undef, { order_by => { -asc => 'rank' } });
     $c->detach('/default')
 	unless $poll && $questions;
     my $psession = $c->session->{$pid};
@@ -110,24 +112,23 @@ sub vote :Chained('poll') :Path :Args(0)
 	# Ignore the buttons - stay on the same question
     } elsif ($c->req->params->{done}) {
 	# Validate all the answers
-	for ($question = $questions->first;
-	     $question && !$$psession{vote_error};
-	     $question = $questions->next) {
+	foreach $question ($questions->all) {
 	    try {
 		my $answer = $answers->{$question->id};
 		$question->validate_answer(@{$answer // []});
 	    } catch {
+		# This question was not answered correctly.  Jump to
+		# it and display the corresponding error message.
 		$$psession{vote_error} = $_;
+		$$psession{qid} = $question->id;
+		$c->response->redirect($c->request->uri);
+		$c->detach();
 	    };
 	}
-	# If an error was found, $question now refers to the first
-	# question which was not answered correctly, and we will jump
-	# to that question and display an error message.  If not, the
-	# voter has answered all the questions.
-	if (!$$psession{vote_error}) {
-	    $c->response->redirect($c->uri_for('/poll', $pid, 'review'));
-	    $c->detach();
-	}
+	# All questions were answered correctly.  Continue to the
+	# review page.
+	$c->response->redirect($c->uri_for('/poll', $pid, 'review'));
+	$c->detach();
     } elsif ($c->req->params->{prev} && $question->prev) {
 	$question = $question->prev;
     } elsif ($c->req->params->{next} && $question->next) {


More information about the svn-src-user mailing list