AJAX和Rails:发布到控制器失败

时间:2013-11-29 20:23:00

标签: jquery ruby-on-rails ajax post web

我有一个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失败了吗?

谢谢

编辑:所以我刚刚检查过它实际上是对数据库应用了更改,但我仍然从错误中打印出警告。为什么会这样?

2 个答案:

答案 0 :(得分:1)

除了@ vinodadhikary的答案之外,最可能的问题是你的控制器没有正确渲染视图。我想写一个答案,因为我认为您将从Chrome / Firefox开发人员工具部分的“Network”标签中受益


Chrome开发者工具

当您发送Ajax调用时,您的系统基本上代表您执行HTTP请求(使用JS)。简单来说,您的浏览器实际上是在不刷新页面的情况下加载URL

大多数人都不明白这一点,并假设AJAX是一种神秘的技术。实际情况是,你得到的错误将是Rails在后端出错的结果。要查看错误,您只需要执行此操作:

  • 右键单击&amp;选择“检查元素”
  • 在加载的标签中,选择“网络”
  • 在网络标签中,向左下滚动&amp;找到Ajax请求(底部是红色)
  • 点击它&amp;加载“预览”子标签
  • 这应该显示请求的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