我有一个Rails模型,它有一个简单的布尔属性。我想在用户单击视图中的复选框时在后台更新该属性。我相信我已经正确配置了AJAX和控制器/路由器,但是当我按下按钮时,AJAX帖子的错误功能会触发,而不是成功。
我不确定从何处开始,我可以从错误中提取任何有用的信息。
配置/ routes.db
...
post "/task_toggle" => "tasks#toggle", :as => "task_toggle"
...
tasks_controller确实存在并且有一个方法切换。
这是身体末尾的javascript。我正在使用taskNumber来获取需要切换的模型的ID,并且我已经确认它确实是正确的。
的JavaScript / AJAX
<script type="text/javascript">
$(document).on("click", ".check-task-btn", function() {
var taskNumber = $(this).parent().attr("id").substring(4);
$.ajax({
url: "/task_toggle",
type: "post",
data: {task_id: taskNumber},
dataType: "JSON",
success: function() {
window.alert("it worked");
},
error: function() {
window.alert("no");
}
});
});
</script>
当我按下标有check-task-btn
课程的复选框时,我收到的信息没有打印。
这是控制器,以防万一这里有值得注意的东西。
TasksController
def toggle
task = Task.find(params[:task_id])
task.finished = !task.finished
task.save
redirect_to root_path
end
有人知道为什么我的AJAX失败了吗?
谢谢
编辑:所以我刚刚检查过它实际上是对数据库应用了更改,但我仍然从错误中打印出警告。为什么会这样?答案 0 :(得分:1)
除了@ vinodadhikary的答案之外,最可能的问题是你的控制器没有正确渲染视图。我想写一个答案,因为我认为您将从Chrome / Firefox开发人员工具部分的“Network”标签中受益
Chrome开发者工具
当您发送Ajax调用时,您的系统基本上代表您执行HTTP请求(使用JS)。简单来说,您的浏览器实际上是在不刷新页面的情况下加载URL
大多数人都不明白这一点,并假设AJAX是一种神秘的技术。实际情况是,你得到的错误将是Rails在后端出错的结果。要查看错误,您只需要执行此操作:
控制器响应
如@vinodadhikary所述,控制人的回应可能是问题的原因。原因是因为respond_to
标签不存在
respond_to
允许您的控制器操作以不同方式处理different mime-types(JS / JSON / HTML)。您目前正在覆盖您的所有请求:
def toggle
task = Task.find(params[:task_id])
task.finished = !task.finished
task.save
redirect_to root_path
end
这将以相同的方式处理每个请求(重定向到root_path),但如果您发送JSON或JS请求,您将更好地处理请求,例如@ vinodadhikary的答案:< / p>
def toggle
task = Task.find(params[:task_id])
task.finished = !task.finished
task.save
repsond_to do |format|
format.html { redirect_to root_path }
format.json
end
end
答案 1 :(得分:0)
我认为罪魁祸首是redirect_to root_path
。尝试回复不同的格式,因为您在ajax调用中要求json
格式。
尝试一下:
def toggle
task = Task.find(params[:task_id])
task.finished = !task.finished
if task.save
respond_to do |format|
format.html { redirect_to root_path }
format.json
end
else
# return an error here accordingly
end
end