【问题标题】:gon is not defined error in javascriptgon未在javascript中定义错误
【发布时间】:2013-06-26 11:37:09
【问题描述】:

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

gon.preference = "hello"

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

console.log(gon.preference)

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

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

帮助?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 我为此工作了几个小时并绕过了这个解决方案,因为我认为这不是我的问题......不用说,这就是解决方案。谢谢大佬!
    【解决方案2】:

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

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

    也适用于 rails 4。

    【讨论】:

    • 我在你发布这篇文章的那天,我正在寻找一些参考资料,我对此表示赞同;-)
    【解决方案3】:

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

    解决方案在application.html.erb内的标题中添加标签&lt;%= include_gon %&gt;

    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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

        我有同样的错误信息,也使用了 user456584 的答案,但错误信息仍然存在。一旦我在控制器中添加了 gon.event = @event 或 gon.events = @events 如下所示,我猜 gon 已被定义,因此,我不再收到错误消息“gon is not defined”。

        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
        

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

        【讨论】:

        • 这与 OP 描述的问题有什么关系?您描述了一个不同的问题和解决方案。也许最好找到一个真正适合的问题。
        【解决方案6】:

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

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

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

        【讨论】:

          【解决方案7】:

          你应该添加

          <%= Gon::Base.render_data %>
          

          到您的application.html.erbhead 部分

          【讨论】:

            【解决方案8】:

            这就是发生在我身上的事

            &lt;% include_gon %&gt;application.html.erb 中,但仍然出现此错误。

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

            为了解决这个问题,就我而言,我只需要确保 routes.rb 路由和控制器/方法的名称匹配

            【讨论】:

            • 您能否举例说明您是如何做到的?
            • @mogoli 我不再有权访问特定代码。只需确保控制器/方法与您正在测试的 URL 匹配(包括控制器方法内的断点或调试消息可能会有所帮助)
            【解决方案9】:

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

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

            在我的 javascript 文件中

            【讨论】:

              【解决方案10】:

              我发现在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
              

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2012-05-11
                • 2014-01-03
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多