簡體   English   中英

Rails:gon未定義錯誤

[英]Rails: gon is not defined error

我被設置為在Heroku Rails 4應用程序中使用Gon。 Gon在暫存的Heroku應用程序中約有90%的時間工作,但在生產的Heroku應用程序中有100%的時間失敗。 在我的控制台中,我收到此錯誤,因為有許多錯誤:

//javascript console
Uncaught ReferenceError: gon is not defined

有很多建議可以解決這個問題,我已經提出了一種非常不完善的解決方案(#8)。 我努力了:

  1. 將<%= include_gon%>放置在application.html.erb正文中。

  2. 將<%= include_gon%>放在application.html.erb頭中。

  3. 將<%= include_gon%>放置在需要它的各個視圖中,而不必將其放在application.html.erb中

  4. 將<%= include_gon%>放置在需要它的各個視圖中,同時將它包含在application.html.erb中

  5. 如果定義了巧妙的<%= include_gon,將<%= include_gon%>替換為? gon && gon.present? %>

  6. 從我的gemfile中刪除turbolink和jquery-turbolinks,但它們未能推送到Heroku。 它們已被替換。

  7. 使用以下方法包裝javascript中所有與gon相關的變量定義:if(gon == defined){var blah = gon.blah} else {var blah = bleh}

  8. 在application.html.erb中包括<%= Gon :: Base.render_data({})%>,並將javascript文件肇事者的全部內容移動到它們各自的視圖文件中。 簡潔的javascript太多了。 但這解決了這個問題。

我不知道如何正確地做到這一點。

如何在我的應用程序中使“ gon”工作? 另外,如果有人知道,為什么在代碼和Rails環境中相同的情況下,為什么它只能在一個Heroku應用程序上運行而不能在另一個應用程序上運行?

更新我從來沒有解決這個問題。 我刪除了Gon並根據需要用Ajax替換了變量。

我發現將其添加到您的標題有幫助。

<%= include_gon(:init => true) %>

同樣適用於rails 4。

在包含javascript應用程序之前,請確保包含gon。

反之亦然

在app / views / layouts / application.html.erb中

 <%= Gon::Base.render_data({}) %> <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %> <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %> 

這就是我將要處理的gon問題:

  • = include_gon應該位於HTML標頭的最頂部。 因此,它將在其他任何JavaScript塊或文件之前加載其變量。
  • 驗證HTML源中是否正確包含gon變量。 大多數時候,它應該沒問題,因為gon很簡單
  • 澄清刷新頁面或導航到另一頁面時是否出現gon is not definedgon is not defined錯誤。 如果錯誤僅在導航到另一個頁面時出現,則問題出在turbolink / ajax,和/或也許您應該在您的js.erb視圖和js.erb視圖中包括= include_gon (還可以看看need_tag: false選項) include_gon

我獲得gon變量的未定義值的另一個原因是因為路由和url不匹配。 因此,gon在某些控制器中工作,而在其他控制器中工作。 其他答案中也提到了這一點

https://stackoverflow.com/a/30105227/5193373

我遇到了gon is not defined問題,並修復了它。 希望以下內容對您有所幫助。

無論您將include_gon方法放在何處,gon都有一個陷阱:如果在渲染視圖時當前未定義任何gon變量(例如,從另一個未定義gon var,但渲染相同視圖的控制器), include_gon方法返回空字符串-因此執行腳本時gon將是未定義的。 該方法在https://github.com/gazay/gon/blob/master/lib/gon/helpers.rb中定義如下

def include_gon(options = {})
  if variables_for_request_present?
    Gon::Base.render_data(options)
  elsif Gon.global.all_variables.present? || options[:init].present?
    Gon.clear
    Gon::Base.render_data(options)
  else
    ''
  end
end

注意這種情況。 就像Schrödinger的貓一樣,從javascript POV來看,gon的定義狀態僅在渲染視圖時才明確(無論是否定義gon var)。 我希望我的javascript知道我的gon cat總是“活着”,並通過在應用程序布局中調用include_gon之前立即定義gon變量來避免這種情況。 因此,即使沒有將gon var傳遞到腳本,也可以確保始終定義gon:

<% gon.gon = 'gon' %>
<%= include_gon %>

更好的方法是返回window.gon = {}作為window.gon = {}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM