我的设置是在我的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 head。
放置<%= include_gon%>在需要它的各个视图中,而不是将它放在application.html.erb
放置<%= include_gon%>在需要它的各个视图中,同时将其包含在application.html.erb
更换<%= include_gon%>如果定义聪明<%= include_gon? gon&& gon.present? %GT;
从我的gemfile中移除turbolinks和jquery-turbolinks,但无法推送到Heroku。它们已被替换。
在javascript中包含所有与gon相关的变量定义: if(gon == defined){var blah = gon.blah} else {var blah = bleh}
包括<%= Gon :: Base.render_data({})%>在application.html.erb中,将javascript文件的全部内容移动到各自的视图文件中。非常不引人注目的javascript。但是这个解决了这个问题。
我对如何做到这一点感到茫然。
如何在我的应用中使'gon'工作?此外,如果有人知道,为什么它在一个Heroku应用程序上工作而在代码和Rails环境中它们相同时不能另一个?
更新 我从未解决过这个问题。我删除了Gon并根据需要用Ajax替换了变量。
答案 0 :(得分:4)
我发现将此添加到您的标题中有帮助。
<%= include_gon(:init => true) %>
也适用于rails 4。
答案 1 :(得分: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 %>
&#13;
答案 2 :(得分:1)
这就是我将要解决的问题:
= include_gon
应该位于HTML标题中,位于最顶层。因此它会在任何其他javascript块或文件之前加载其变量。gon is not defined
错误。如果错误仅在导航到另一个页面时出现,那么问题来自turbolink / ajax,和/或您可能应该在= include_gon
个视图和部分视图中包含js.erb
(并且还要看看need_tag: false
} include_gon
选项
答案 3 :(得分:0)
我为我的gon变量获取未定义值的另一个原因是因为路由和url不匹配。因此gon在某些控制器中工作,而在其他控制器中没有工作。在另一个答案中也提到了这一点
答案 4 :(得分:0)
我也遇到了gon is not defined
问题并已解决。希望以下内容对您有所帮助。
gon有一个陷阱,无论您放置include_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 = {}
作为替代。