如何响应Rails中的ajax调用
问题描述:
我知道关于这个问题已经有很多问题了,但是没有一个对我有用。这里是我的Ajax代码:如何响应Rails中的ajax调用
function update_schedule($task){
var taskId = $task.data("taskId"),
startHour, endHour,
userId = $('#users').val();
if(!$task.hasClass('daily-task')){
startHour = getStartHour($task),
endHour = startHour + (+$task.data('time'));
}
console.log(startHour, endHour)
$.ajax({
url: '/heimdall/update_scheduled_task',
method: 'POST',
data: { "task_id": taskId, "start_hour": startHour, "end_hour": endHour, "user_id": userId },
success: function(){
console.log("SUCESS!!", data['head'])
},
error: function() {
console.log("FAILURE");
},
async: true
});
}
控制器代码:
def update_scheduled_task
scheduled_task = ScheduledTask.find_or_create_by(task_id: params[:task_id])
scheduled_task.update_attributes(start_hour: params[:start_hour], end_hour: params[:end_hour], task_id: params[:task_id], user_id: params[:user_id])
end
我想返回找到或创建任务的ID。我不知道如何发送/接收这些信息。我已阅读有关回应,但我仍然不知道如何在这种情况下使用它。
答
你可以做render json: ...
返回JSON格式所需的Infor阿贾克斯:
def update_scheduled_task
scheduled_task = ScheduledTask.find_or_create_by(task_id: params[:task_id])
scheduled_task.update_attributes(start_hour: params[:start_hour], end_hour: params[:end_hour], task_id: params[:task_id], user_id: params[:user_id])
render json: {scheduled_task_id: scheduled_task.id}
end
而在AJAX功能的成功,这样使用它:
success: function (data){
var data = JSON.parse(data);
console.log(data["scheduled_task_id"]);
},
答
的jQuery的success
而error
回调依赖于控制器返回的状态码。确保在无法创建/读取/更新对象时返回正确的状态码。成功时,只需使用id属性集来呈现JSON即可。我beleive update_attributes
回报true
成功:
if scheduled_task && scheduled_task.update_attributes(...)
render json: { id: scheduled_task.id }
else
head :unprocessable_entity
end
答
首先,你需要提高你的控制器代码结构(你可以依靠默认的脚手架发电机的方法)。然后,你必须表明你的方法将只JSON格式的回应,与要返回答案,是这样的:
def update_scheduled_task
scheduled_task = ScheduledTask.find_or_create_by(task_id: params[:task_id])
if (scheduled_task && scheduled_task.update_attributes(start_hour: params[:start_hour], end_hour: params[:end_hour], task_id: params[:task_id], user_id: params[:user_id]))
render json: { scheduled_task_id: scheduled_task.id }
else
render json: { error: l18n.t("error.messages.request_error") }
end
end
然后,你必须修改的jQuery Ajax请求的成功和失败的响应方法。下面是它可能如何看一个例子:
$.ajax({
url: "/heimdall/update_scheduled_task",
method: "post",
data: { task_id: taskId, start_hour: startHour, end_hour: endHour, user_id: userId },
success: function(result) {
if (result["scheduled_task_id"] != null) {
console.log("Schedule record => " + result["scheduled_task_id"])
} else {
console.log("Error: " + result["error"])
}
},
error: function() {
console.log("Ajax request error");
},
// async: true => By default JQuery set true to async param.
});
不要忘记,你需要添加一个规则,在文件的config/ruotes.rb访问此方法是这样的:
post update_scheduled_task, :defaults => { :format => 'json' }
我希望这有助于你,问候!
我仍然收到错误:未捕获SyntaxError:在位置1的JSON中出现意外的令牌o – Mark
您可以在控制器中打印'scheduled_task.id'的值并发布要打印的内容吗? – Abhi
问题在于解析为JSON两次,第一次呈现,第二次成功。删除数据解析后,everythign完美工作。谢谢。 – Mark