gon没有在javascript中定义错误

时间:2013-06-28 16:07:16

标签: ruby-on-rails ruby-on-rails-3

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

gon.preference = "hello"

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

console.log(gon.preference)

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

不知道为什么gon不能正常工作!

帮助?

10 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:4)

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

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

也适用于rails 4。

答案 2 :(得分: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"

输出: enter image description here


了解更多here

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:1)

我有相同的错误消息,并且还使用了用户456584的回答,但错误消息仍然存在。一旦我在控制器中添加了如下所示的gon.event = @event或gon.events = @events,我猜gon已经定义,因此,我不再有错误消息&#34; gon未定义&#34;。< / p>

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

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

答案 5 :(得分:1)

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

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

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

答案 6 :(得分:1)

以下是发生在我身上的事情

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

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

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

答案 7 :(得分:0)

你应该添加

<%= Gon::Base.render_data %>

head

application.html.erb部分

答案 8 :(得分:0)

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

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

在我的javascript文件中

答案 9 :(得分:0)

我发现必须考虑在app/views/layout/application.html.slim标头中加载gon和应用javascript的顺序

我必须先加载gon ,然后再这样加载javascript:

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'会立即引起相同的错误。