6

很简单的问题。我正在尝试使用gon。我在控制器中设置变量是这样的:

gon.preference = "hello"

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

console.log(gon.preference)

但我收到一条错误消息,说“gon 未定义”。可能是什么问题呢?显然,rails 认识到存在 gon 变量。.js.erb 文件位于我的 assets/javascripts 目录中。我尝试将文件名更改为 .js(尽管我根本没想到这会有所作为)。显然没有变化。

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

帮助?

4

10 回答 10

13

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

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

于 2013-07-02T19:20:36.987 回答
4

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

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

也适用于 rails 4。

于 2015-02-25T12:13:51.963 回答
2

我创建了一个测试项目来尝试看看我是否有同样的问题,我做到了!

<%= include_gon %>解决方案在您的标题中添加标签application.html.erb

app/views/layouts/application.html.erb

<!DOCTYPE html>
<html>
<head>
  <title>Test</title>
  <%= include_gon %>
  <%= stylesheet_link_tag    "application", media: "all", "data-turbolinks-track" => true %>
  <%= javascript_include_tag "application", "data-turbolinks-track" => true %>
  <%= csrf_meta_tags %>
</head>

在视图中:

console.log(gon.preference)

在控制器中:

gon.preference = "hello"

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


在这里阅读更多

于 2013-06-28T17:49:20.630 回答
1

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

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

这使include_gon参考尽可能保持干燥,同时仍然保持灵活和不引人注目。

于 2014-05-15T17:40:37.670 回答
1

我自己也遇到了同样的问题,我想知道 include_gon 调用是否应该在正文而不是 application.html.erb 的标头中。在 application.html.erb 的 header 和 body 中放置一个 js alert 表明 header 并不总是被调用,而 body 是。

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

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

于 2014-11-30T17:04:12.463 回答
1

我有相同的错误消息,也使用了 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

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

于 2014-09-17T09:58:19.270 回答
1

这是发生在我身上的事情

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

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

为了解决它,在我的情况下,我只需要确保routes.rb路由和控制器/方法的名称匹配

于 2015-05-07T15:17:01.117 回答
1

你应该添加

<%= Gon::Base.render_data %>

head你的部分application.html.erb

于 2017-08-26T13:25:04.437 回答
0

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

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

在我的 javascript 文件中

于 2018-03-01T18:41:57.127 回答
0

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

在像这样加载 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

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

于 2018-10-09T18:16:43.033 回答