非常简单的问题。我正在尝试使用gon。我在控制器中设置变量如下:
gon.preference = "hello"
在我的.js.erb文件中,我尝试使用这样的变量:
console.log(gon.preference)
但是我收到一条错误,说“gon未定义”。可能是什么问题呢?显然,rails认识到有一个gon变量。 .js.erb文件位于我的assets / javascripts目录中。我尝试将文件名更改为.js(虽然我没想到这会产生任何影响)。显然没有变化。
不知道为什么gon不能正常工作!
帮助?
答案 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"
输出:
了解更多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'
会立即引起相同的错误。