Setup:
Using Play! framework v 2.0.4
Controller:
def javascriptRoutes = Action { implicit request => Ok( Routes.javascriptRouter("jsRoutes")( routes.javascript.Admin.approve ) ).as("text/javascript") } def approve(user: List[String]) = SecureAction('admin) { implicit ctx => Logger.debug("Admin.approve: " + user.foldLeft("")(_ + "::" + _)) user map { u => User.approve(u) } Ok(Json.toJson(user)) }
View:
function get_selected() { return $.makeArray($(".user-selector").map(function (ind, user){ if(user.checked) return user.name; })); } $("#button-approve").click(function(){ jsRoutes.controllers.Admin.approve(get_selected()).ajax({ success: function(data, status) { console.log("Users activated: " + data) for(i = 0; i < data.length; i++) { id = "#" + data[i]; $(id + " > td > i.approved").removeClass("icon-flag").addClass("icon-check"); } $(":checked").attr("checked", false); } }); });
Routes:
PUT /admin/users controllers.Admin.approve(user: List[String]) GET /admin/jsRoutes controllers.Admin.javascriptRoutes
I also used the code mentioned in this question to allow List[String] binding as a parameter.
Problem
Parameters are passed in the request specified as follows:
PUT /admin/users?user=506b5d70e4b00eb6adcb26a7%2C506b6271e4b00eb6adcb26a8
The encoded character %2C is a comma. The controller interprets it as a single line, because the debug line from the above code looks like this:
[debug] application - Admin.approve: ::506b5d70e4b00eb6adcb26a7,506b6271e4b00eb6adcb26a8
(the default use of List.toString was misleading why I used the foldLeft trick).
So
How to transfer the list of flags to the selected users on the controller so that it is interpreted as a list of lines, rather than a list of one line?
source share