gon未在javascript中定义错误

非常简单的问题。 我正在尝试使用gon。 我在控制器中设置变量,如下所示:

gon.preference = "hello" 

在我的.js.erb文件中,我尝试使用这样的变量:

 console.log(gon.preference) 

但我得到一个错误,说“gon没有定义”。 可能是什么问题呢? 显然,rails认识到有一个gon变量。 .js.erb文件位于我的assets / javascripts目录中。 我尝试将文件名更改为.js(虽然我没想到这会产生任何影响)。 显然没有变化。

不知道为什么gon不起作用!

救命?

这里很好的答案,但确切地知道发生了什么。 我多次渲染没有布局的特定视图。 但是,由于我在重新渲染此视图时没有渲染布局,因此application.html.erb中的<%= include_gon %>行无用。

我将<%= include_gon %>直接放入我正在渲染的视图中,现在一切正常!

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

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

也适用于导轨4。

我创建了一个测试项目,试图看看我是否有同样的问题,我发现了!

解决方案在application.html.erb中的标头中添加标记<%= include_gon %>

 app/views/layouts/application.html.erb 

    Test <%= include_gon %> <%= stylesheet_link_tag "application", media: "all", "data-turbolinks-track" => true %> <%= javascript_include_tag "application", "data-turbolinks-track" => true %> <%= csrf_meta_tags %>  

在视图中:

 console.log(gon.preference) 

在控制器中:

 gon.preference = "hello" 

输出: 在此处输入图像描述


在这里阅读更多

@ Ringo解决方案的替代方法是将语句保留在应用程序布局文件中,只需按如下方式修改它:

 <%= include_gon if defined? gon && gon.present? %> 

这使得include_gon引用尽可能保持DRY,同时仍然保持灵活和不引人注目。

我有相同的错误消息,并使用user456584的答案,但错误消息仍然存在。 一旦我在控制器中添加gon.event = @event或gon.events = @events,我猜gon已经定义,因此,我不再有错误消息“gon未定义”。

 def show @event = Event.find(params[:id]) gon.events = @events respond_to do |format| format.html # show.html.erb format.json { render json: @event } end end 

我是新用户,我只是想贡献。 在所有其他建议之后,这是唯一对我有用的方法。

我只是遇到了我认为同样的问题,我想知道include_gon调用是否应该在正文中而不是application.html.erb的标题中。 在application.html.erb的标题和正文中都放置了一个js警报,表明标题并不总是被调用,而正文是。

如果我最初在我的网站上加载了一个页面,而不是使用它的那个页面,然后通过标题链接在那里导航,我遇到了缺乏gon但是如果我最初加载了gon-using页面,该网站将正常工作,直到在任何其他页面上重新加载。

将include_gon从标题移动到布局的主体似乎已经解决了这个问题。 我意识到这不是gon docs如何建议应该这样做的,但是我不知道它将如何以另一种方式工作。

这是发生在我身上的事

<% include_gon %>位于application.html.erb中,但仍然出现此错误。

最后的原因是在控制器 中,方法名称是我设置的gon变量与视图路径不匹配。 因此在渲染视图之前没有调用控制器方法,并且似乎只在使用时包含gon (这很棒)

要解决它,在我的情况下,我只需要确保routes.rb路由和Controler / Method的名称匹配

你应该添加

 <%= Gon::Base.render_data %> 

application.html.erbhead部分

我最近遇到了同样的问题,我的解决方案是添加

 if(window.gon != null) { ... } 

在我的javascript文件中

我发现在app/views/layout/application.html.slim标头中考虑加载gon和应用程序javascript的顺序很重要。

加载像这样的javascript 之前我必须加载gon:

 doctype html html lang= I18n.locale.to_s head meta charset='utf-8' meta name='viewport' content='width=device-width, initial-scale=1.0' title == content_for?(:title) ? yield(:title) : t('general.home') = stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' = include_gon = javascript_include_tag 'application' = javascript_include_tag 'https://www.gstatic.com/charts/loader.js' = csrf_meta_tag = favicon_link_tag 'favicon.ico' body .main = render 'layouts/navbar' = render 'layouts/title', title: @title = render 'layouts/messages' = yield 

= javascript_include_tag 'applicaion'之后移动= include_gon立即引发相同的错误。