Rails:gon没有定义错误

时间:2014-07-02 21:38:01

标签: javascript ruby-on-rails heroku ruby-on-rails-4

我的设置是在我的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 head。

  3. 放置<%= include_gon%>在需要它的各个视图中,而不是将它放在application.html.erb

  4. 放置<%= include_gon%>在需要它的各个视图中,同时将其包含在application.html.erb

  5. 更换<%= include_gon%>如果定义聪明<%= include_gon? gon&& gon.present? %GT;

  6. 从我的gemfile中移除turbolinks和jquery-turbolinks,但无法推送到Heroku。它们已被替换。

  7. 在javascript中包含所有与gon相关的变量定义: if(gon == defined){var blah = gon.blah} else {var blah = bleh}

  8. 包括<%= Gon :: Base.render_data({})%>在application.html.erb中,将javascript文件的全部内容移动到各自的视图文件中。非常不引人注目的javascript。但是这个解决了这个问题。

  9. 我对如何做到这一点感到茫然。

    如何在我的应用中使'gon'工作?此外,如果有人知道,为什么它在一个Heroku应用程序上工作而在代码和Rails环境中它们相同时不能另一个?

    更新 我从未解决过这个问题。我删除了Gon并根据需要用Ajax替换了变量。

5 个答案:

答案 0 :(得分:4)

我发现将此添加到您的标题中有帮助。

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

也适用于rails 4。

答案 1 :(得分:4)

在包含javascript应用程序之前,请确保包含gon。

反其道而行

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

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

答案 2 :(得分:1)

这就是我将要解决的问题:

  • = include_gon应该位于HTML标题中,位于最顶层。因此它会在任何其他javascript块或文件之前加载其变量。
  • 在HTML源代码中验证是否正确包含gon变量。大多数时候它应该没问题,因为gon很简单
  • 说明刷新页面或导航到其他页面时是否显示gon is not defined错误。如果错误仅在导航到另一个页面时出现,那么问题来自turbolink / ajax,和/或您可能应该在= include_gon个视图和部分视图中包含js.erb(并且还要看看need_tag: false}
  • include_gon选项

答案 3 :(得分:0)

我为我的gon变量获取未定义值的另一个原因是因为路由和url不匹配。因此gon在某些控制器中工作,而在其他控制器中没有工作。在另一个答案中也提到了这一点

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

答案 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 = {}作为替代。