From 0104f9431054644264468b03c75144f675e7eef4 Mon Sep 17 00:00:00 2001 From: Nicolas Leroux Date: Tue, 8 May 2012 08:54:16 +0200 Subject: [PATCH] [#1457] js function created by jsAction tag shouldn't include null parameters when constructing url --- framework/src/play/templates/FastTags.java | 34 +++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/framework/src/play/templates/FastTags.java b/framework/src/play/templates/FastTags.java index d3063f0df9..9a81c50147 100644 --- a/framework/src/play/templates/FastTags.java +++ b/framework/src/play/templates/FastTags.java @@ -56,7 +56,39 @@ public static void _verbatim(Map args, Closure body, PrintWriter out, Exec } public static void _jsAction(Map args, Closure body, PrintWriter out, ExecutableTemplate template, int fromLine) { - out.println("function(options) {var pattern = '" + args.get("arg").toString().replace("&", "&") + "'; for(key in options) { pattern = pattern.replace(':'+key, options[key]); } return pattern }"); + out.println("function(options) {var pattern = '" + args.get("arg").toString().replace("&", "&") + "';"); + out.println(" var argsStart = pattern.indexOf('?') + 1;"); + out.println(" var notNullOptions = new Array();"); + out.println(" if (argsStart >= 0) {"); + out.println(" for (key in options) {"); + out.println(" var val = options[key];"); + out.println(" if (val != null) {"); + out.println(" notNullOptions[key] = val;"); + out.println(" } else {"); + out.println(" var nullArgPlaceHolder = key + '=:' + key;"); + out.println(" var argIndexInPattern = pattern.indexOf(nullArgPlaceHolder, argsStart);"); + out.println(" var beforeNullArg = pattern.substring(0, argIndexInPattern);"); + out.println(" var afterNullArg = pattern.substring(argIndexInPattern + nullArgPlaceHolder.length);"); + out.println(" var charBeforeNullArg = beforeNullArg.charAt(beforeNullArg.length - 1);"); + out.println(" if (charBeforeNullArg == '&') {"); + out.println(" beforeNullArg = beforeNullArg.substring(0, beforeNullArg.length - 1);"); + out.println(" } else if (afterNullArg.charAt(0) == '&') {"); + out.println(" afterNullArg = afterNullArg.substring(1);"); + out.println(" } else if (charBeforeNullArg == '?' && afterNullArg.length == 0) {"); + out.println(" beforeNullArg = beforeNullArg.substring(0, beforeNullArg.length - 1);"); + out.println(" }"); + out.println(" pattern = beforeNullArg + afterNullArg;"); + out.println(" }"); + out.println(" }"); + out.println(" } else {"); + out.println(" notNullOptions = options;"); + out.println(" }"); + out.println(" for (key in notNullOptions) {"); + out.println(" var val = options[key];"); + out.println(" pattern = pattern.replace(':' + key, options[key]);"); + out.println(" }"); + out.println(" return pattern;"); + out.println("}"); } public static void _jsRoute(Map args, Closure body, PrintWriter out, ExecutableTemplate template, int fromLine) {