2013-06-19 53 views
0

首先 - 我有同樣的錯誤讀取所有其他線程對SO。他們中沒有人幫助我一點。無法讀取未定義紅寶石的財產「頂」 on Rails項目

流量:

  1. 在新客戶頁面,填寫字段,然後點擊保存在customer_controller
  2. 斷火的方法來創建
  3. 渲染JSON與回頁面信息:

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

  4. Page獲取數組:

    陣列[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] 

「秀」在這裏是不是我們問題的方法 - 我們正在使用的「創造」

Processing by CustomersController#create as JSON 

那麼,爲什麼在藍血腥大火我們不知道是什麼「flash_message」是?

+0

所有這些東西發生在文檔'load'事件觸發後? – Cherniv

+0

好吧,在這種情況下,文檔'就緒',但是,之後。 – notaceo

回答

0

這個好更新 - 儘管這段代碼:

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

這裏踢球是我太傻了 - 我們甚至不使用FLASH在這些消息的Rails中!

我們通過AJAX調用返回一個JSON對象給瀏覽器,這個調用是通過一個客戶控制器內部的方法進行的(這真是一口)。

所以我的JSON找不到「flash_message」因爲除非我打電話的Rails

閃光法,我不得不爲「標準」類型的消息再創建一個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" /> 

我們給它一個顯示:無風格,因爲「警戒」級葉片這個醜陋的黃色欄橫跨整個頁面(bootstrap善良!)

所以答案是,我從來沒有調用flash.each,而div只存在於您調用flash.each時 - 它被打印並欺騙了我的眼睛,但不是真的存在。

提示:始終在您渲染的實際頁面上單擊「查看源代碼」,而不是直接盯着代碼查看日期。

1

試圖從網頁獲得的大小或位置時,我遇到了計時問題。在大多數情況下,這個問題確實是該物體還沒有加載完成,因此該數據尚不得而知。

正如Cherniv提到的,我也認爲你可能需要使用load事件,因爲準備事件的頁面之前觸發(因此也是必要的佈局)已完成加載。在整個頁面完成之前,加載事件不會被觸發,因此您的數據應該可用。

下面是堆棧溢出了另一種解釋: load-ready events

相關問題