[英]Rails: gon is not defined error
我被設置為在Heroku Rails 4應用程序中使用Gon。 Gon在暫存的Heroku應用程序中約有90%的時間工作,但在生產的Heroku應用程序中有100%的時間失敗。 在我的控制台中,我收到此錯誤,因為有許多錯誤:
//javascript console
Uncaught ReferenceError: gon is not defined
有很多建議可以解決這個問題,我已經提出了一種非常不完善的解決方案(#8)。 我努力了:
將<%= include_gon%>放置在application.html.erb正文中。
將<%= include_gon%>放在application.html.erb頭中。
將<%= include_gon%>放置在需要它的各個視圖中,而不必將其放在application.html.erb中
將<%= include_gon%>放置在需要它的各個視圖中,同時將它包含在application.html.erb中
如果定義了巧妙的<%= include_gon,將<%= include_gon%>替換為? gon && gon.present? %>
從我的gemfile中刪除turbolink和jquery-turbolinks,但它們未能推送到Heroku。 它們已被替換。
使用以下方法包裝javascript中所有與gon相關的變量定義:if(gon == defined){var blah = gon.blah} else {var blah = bleh}
在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塊或文件之前加載其變量。 gon is not defined
的gon is not defined
錯誤。 如果錯誤僅在導航到另一個頁面時出現,則問題出在turbolink / ajax,和/或也許您應該在您的js.erb
視圖和js.erb
視圖中包括= include_gon
(還可以看看need_tag: false
選項) include_gon
) 我獲得gon變量的未定義值的另一個原因是因為路由和url不匹配。 因此,gon在某些控制器中工作,而在其他控制器中工作。 其他答案中也提到了這一點
我遇到了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.