Как передать переменную, являющуюся массивом в JavaScript, в контроллер, принимающий List [String] в качестве параметра?
Настройка:
Используя Play! Framework v 2.0.4
Контроллер:
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))
}
Вид:
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);
}
});
});
Маршруты:
PUT /admin/users controllers.Admin.approve(user: List[String])
GET /admin/jsRoutes controllers.Admin.javascriptRoutes
Я также использовал код, упомянутый вэтот вопрос разрешить привязкуList[String]
в качестве параметра.
Параметры передаются в запросе, сообщаемом так:
PUT /admin/users?user=506b5d70e4b00eb6adcb26a7%2C506b6271e4b00eb6adcb26a8
Закодированный%2C
символ запятая. Контроллер интерпретирует ее как одну строку, потому что строка отладки из приведенного выше кода выглядит следующим образом:
[debug] application - Admin.approve: ::506b5d70e4b00eb6adcb26a7,506b6271e4b00eb6adcb26a8
(используя значение по умолчаниюList.toString
вводил в заблуждение, чтопочему я использовалfoldLeft
трюк).
Как передать список выбранных пользователей в контроллер, чтобы он интерпретировался как список строк, а не как список из одной строки?