0

首先 - 我已经阅读了 SO 上的所有其他线程,但都有相同的错误。他们都没有帮助我一点。

流动:

  1. 在新客户页面上,填写字段,单击保存
  2. 在 customer_controller 中触发方法来创建
  3. 将带有信息的 json 渲染回页面:

    format.json {render :json => res.to_a }

  4. 页面获取数组:

    数组[2] 新:851

这是一个格式正确的数组。

错误:

Uncaught TypeError: Cannot read property 'top' of undefined 

溯源:

$.ajax({
    type : "POST",
    url : "/customers",
    data : dataString,
    dataType : "json",
    success : function(data) {
      console.log(data);
      // data = data[0];
      // console.log(data);
      if (data[0] == 'error' || data[0] == 'i') {
        $("#flash_message").addClass("alert-error");
        $("#flash_message").html("<p>" + data[1] + "</p>");
        $('html,body').animate({
          scrollTop : $("#flash_message").offset().top
        }, 'slow');
      } else {
        $("#flash_message").addClass("alert-success");
        $("#flash_message").html("<p>" + data[0] + "</p>");
        $('html,body').animate({
          scrollTop : $("#flash_message").offset().top

flash_message 嗯?让我们在视图中查看:

<% flash.each do |key, value| %>
<div id="flash_message" class="alert alert-<%= key %>">
    <%= value %>

是的,那里肯定有一个 flash_message id。

但是,我们正在使用布局 - 所以一定存在时间问题。AJAX 代码位于 admin.html.erb 布局中,我们正在完成来自 customer.html.erb 视图的新客户操作。客户控制器有:

  layout 'admin', :except => [:show]

“show”不是我们在这里讨论的方法——我们使用的是“create”

Processing by CustomersController#create as JSON

那么为什么在血腥的大火中我们不知道“flash_message”是什么?

4

2 回答 2

1

我在尝试从网页获取尺寸或位置时遇到了计时问题。在大多数情况下,问题确实是对象还没有完成加载,因此数据还不知道。

正如 Cherniv 提到的,我还认为您可能需要使用 load 事件,因为在页面(以及所需的布局)完成加载之前触发了 ready 事件。在整个页面完成之前不会触发加载事件,因此您的数据应该可用。

这是堆栈溢出的另一种解释: 加载就绪事件

于 2013-06-19T11:38:59.460 回答
0

好的更新 - 尽管有这段代码:

<% flash.each do |key, value| %>
<div id="flash_message" class="alert alert-<%= key %>">
    <%= value %>
<%end%>

这里的踢球者是我很愚蠢——我们甚至没有在 Rails 中使用 FLASH 来处理这些消息!!!

我们通过 AJAX 调用将一个 JSON 对象返回给浏览器,该调用是对客户控制器内部的一个方法进行的(哇——那是满嘴的)。

所以我的 JSON 找不到“flash_message”,因为它不存在,除非我在 Rails 中调用 flash 方法

我不得不为“标准”类型的消息创建另一个 div。现在我不确定为什么我的团队开发了两种将消息打印回窗口的方法,但这是一个不同的主题......

<% flash.each do |key, value| %>
<div id="flash_message" class="alert alert-<%= key %>">
    <%= value %>
<%end%>
<div id="flash_message" class="alert" style="display:none" />

我们给它一个 display:none 样式,因为“alert”类在整个页面上留下了这个丑陋的黄色条(引导程序好!)

所以答案是我从来没有调用过 flash.each,只有当你调用 flash.each 时 div 才存在——它被打印出来并欺骗了我的眼睛,但实际上并不存在。

专业提示:始终在您呈现的实际页面上单击“查看源代码”,而不是连续几天盯着您的代码。

于 2013-06-24T22:04:45.473 回答