【问题标题】:Rails 3.1 issue with javascript_include_tag in application.html.erbRails 3.1 与 application.html.erb 中的 javascript_include_tag 问题
【发布时间】:2011-11-09 01:28:54
【问题描述】:

我创建了一个名为 demo1 的干净简单的 Rails 3.1 应用程序。它包含两个控制器——你好和再见。当我尝试加载 http://localhost:3000/say/hello 时出现以下错误:

ActionView::Template::Error (
  (in /home/me/dev/ruby/demo1/app/assets/javascripts/say.js.coffee)):
    3: <head>
    4:   <title>Demo1</title>
    5:   <%= stylesheet_link_tag    "application" %>
    6:   <%= javascript_include_tag "application" %>
    7:   <%= csrf_meta_tags %>
    8: </head>
    9: <body>
  app/views/layouts/application.html.erb:6:in     
`_app_views_layouts_application_html_erb___558576499_89622220'

application.html.erb的问题行是:

<%= javascript_include_tag "application" %>

当我使用 Rails 3.0 创建应用程序时,这一行是:

<%= javascript_include_tag :defaults %>

这很好用。实际上,当我将 application.html.erb 更改为使用 :defaults 时,一切正常,但我想使用 Rails 3.1 的新功能。

我似乎无法在 Google 上找到任何关于此的内容,我猜是因为 Rails 3.1 刚刚发布。

顺便说一句,我正在关注Agile Web Development with Rails (4th edition) Updated for Rails 3.1本书的第一章。

一些环境信息可能有助于回答这个问题:

$ cat /etc/issue
Ubuntu 10.04.2 LTS \n \l

$ ruby -v
ruby 1.9.2p290 (2011-07-09 revision 32553) [i686-linux]

$ rails -v
Rails 3.1.0

say.js.coffee 文件的内容:

# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/

【问题讨论】:

  • 快速提问,当你运行 bundle install 时,一切都安装正确了吗?我想知道 exec.js 是否有问题
  • 是的,我再次重新运行 bundle install 并且一切似乎都很好......有什么想法可以深入挖掘吗?
  • 尝试查看创建应用程序时的终端输出,看看是否安装失败。自 beta 版本以来,我一直在使用 rails 3.1。我尝试按照书中的建议从头开始创建演示应用程序,并创建了控制器。它按预期工作。同样,我已经安装了 execjs 和 coffee-script。所以它只需要找到它并将其绑定到锁定的 gemfile。
  • 很好的建议。那么你是在使用 Rails 3.1 之前安装了 execjs 和 coffee-script 还是在 Rails 3.1 中创建项目时安装了它们?
  • 它们在 Rails 3.1 的默认 gemfile 中。因为我已经使用测试版几个月了,我已经安装了这些。

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


【解决方案1】:

好的,我已经找出问题所在,所以我会回答我自己的问题。

问题是 app/assets/javascripts/application.js 文件包含注释掉的代码。但是,其中一条被注释掉的行如下:

//= require_tree .

当我删除这一行时,一切正常。

希望这会有所帮助。如果有人可以就下划线导致问题的原因提供一些见解,那就太好了。

【讨论】:

  • 您输入的答案实际上是正确的。这将包括文件夹 assets/javascripts 下的所有 javascript 文件。请参阅:guides.rubyonrails.org/…。我今天早些时候创建的 Rails 3.1 应用程序具有该功能,并且运行良好。我还有两个空的咖啡脚本文件。
  • 我从 ROR 开始,遇到了同样的问题,同样的解决方案有效!但是,如果删除该行更可取,我仍然没有从讨论中得到答案,它是如何解决问题的?
  • 这样做可能会阻止错误发生,但这并不是真正的解决方案。 “注释掉”行实际上是资产管道的处理指令。我不确定你的问题到底是什么,但也许同一个 JS 文件被包含了两次?
  • 我必须删除 //= 还需要 turbolinks 才能让应用程序运行
  • 谢谢,帮了大忙。
【解决方案2】:

您可以尝试的另一件对我有用的事情是将 json(也许还有 yajl-ruby)gem 添加到您的 Gemfile 中。我真的不明白为什么以前没有安装它们,因为:

rails 依赖于 actionpack 这取决于链轮 这取决于 json 和倾斜

倾斜取决于 yajl-ruby

然而,不知何故,似乎许多依赖的 gem 没有安装!?

【讨论】:

    【解决方案3】:

    我在运行 rails 3.1.1 时遇到了同样的问题

    在我的 Gemfile 中恢复以下代码后,我的问题就消失了:

    group :assets do
      gem 'sass-rails',   '~> 3.1.4'
      gem 'coffee-rails', '~> 3.1.1'
      gem 'uglifier', '>= 1.0.3'
    end
    
    gem 'jquery-rails'
    

    这是在最初设置项目时放置在我的 Gemfile 中的,即使用“rails new myapp”。

    请注意,我的模板文件中包含:

    <%= javascript_include_tag :application %>
    

    希望有帮助

    【讨论】:

      【解决方案4】:

      我在启动新的 RoR 3.2.1 应用程序时遇到了这个问题。问题是您缺少 JS 运行时,这是因为该行

      # gem 'therubyracer'
      

      在您的 Gemfile 中,前面有 #。上帝只知道他们为什么发布带有注释的 Rails,因为任何使用 generate scaffold 或类似内容的教程都会导致资产编译过程因生成的咖啡脚本文件而出错。

      解决方案是取消注释该行。安装另一个 JS 运行时也可以解决问题。参见例如ExecJS and could not find a JavaScript runtime.

      official ruby on rails guide 说:

      将 CoffeeScript 编译为 JavaScript 需要一个 JavaScript 运行时,而缺少运行时会给你一个 execjs 错误。通常 Mac OS X 和 Windows 都安装了 JavaScript 运行时。 Rails 在新应用的注释行中将 therubyracer gem 添加到 Gemfile 中,如果需要,您可以取消注释。 therubyrhino 是 JRuby 用户推荐的运行时,默认添加到在 JRuby 下生成的应用程序中的 Gemfile 中。您可以在 ExecJS 上调查所有支持的运行时。

      【讨论】:

      • 这有效并解决了这个问题,我在使用 rails 3.2 的 ubuntu 12.04 上关注 rails 教程的介绍并收到此错误
      【解决方案5】:

      如果使用 linux(像我的 Ubuntu linux),请安装 javascript 运行时。最好是发出以下命令进行安装,

      apt-get 安装 nodejs

      或者,对于每一个新创建的 rails 项目,添加

      gem 'therubyracer' 到你的 gemfile 并运行 bundle install

      【讨论】:

        【解决方案6】:

        如果您在 Windows 上并且使用 RailsInstaller 进行开发,则需要使用 RailsInstaller 随附的 .bat 文件来运行您的服务器。不幸的是,您也不能使用任何像 conemu 这样的 CMD 钩子来启动服务器。

        【讨论】:

          【解决方案7】:

          为了未来的 Google 员工的利益,我在尝试安装 therubyracer 时陷入了困境,直到我偶然发现了这篇相关帖子:

          ExecJS::RuntimeError in rails 3.2.8 engine with javascript_include_tag

          提到的链接说明 ExecJS 为 Windows 8 开箱即用配置不正确。特别是 pottsk 描述的解决方法对我有用。

          https://github.com/sstephenson/execjs/issues/81#issuecomment-9892952

          这涉及更改cscript 可执行文件在%rubyinstall%\gems\2.0.0\gems\execjs-2.0.1\lib\execjs\runtimes.rb 中由ExecJS 运行的方式:

          # JScript = ExternalRuntime.new(
          #   :name        => "JScript",
          #   :command     => "cscript //E:jscript //Nologo //U",
          #   :runner_path => ExecJS.root + "/support/jscript_runner.js",
          #   :encoding    => 'UTF-16LE' # CScript with //U returns UTF-16LE
          # )
          
          JScript = ExternalRuntime.new(
              :name        => "JScript",
              :command     => "cscript //E:jscript //Nologo",
              :runner_path => ExecJS.root + "/support/jscript_runner.js",
              :encoding    => 'UTF-8' # CScript with //U returns UTF-16LE
          )
          

          不用说,这不是一个永久的解决方案,但它确实让我启动并运行,直到补丁被合并。

          【讨论】:

          • 呸,但这不会使用与 IE 相同的 js 引擎吗?最好使用 therubyrhino 甚至更好的 NodeJS
          【解决方案8】:

          只需删除application.js中的两行

          //= require turbolinks

          //= require_tree

          【讨论】:

            【解决方案9】:
            devise_scope :user do
                  get 'sign_out', :to => 'devise/sessions#destroy', :as => :destroy_user_session
               end
            

            如果您的 routes.rb 有上面这行,只需删除它并运行。这就是纠正我的问题的原因。

            【讨论】:

              【解决方案10】:

              修改生成器文件(application.html.erb.tt)如下:

              <%= javascript_include_tag "application", "data-turbolinks-track" true %>
              <%= javascript_include_tag :default, "data-turbolinks-track" true %>
              

              【讨论】:

                【解决方案11】:

                只需从生成器文件 (application.html.erb) 中删除以下行(第 6 行):

                <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
                

                如果删除此行有任何缺点,请告诉我

                谢谢

                【讨论】:

                  【解决方案12】:

                  我在 Rails 4 中遇到了这个问题,如果我将它切换到“默认值”而不是“应用程序”,它可以正常工作,就像 OP 所说的那样。但这是在我不想编辑的外部 Gem 中。我发现如果我强制我的 Gemfile 使用 1.8.0 版的 coffee-script-source,进行捆绑安装,然后启动服务器,那么一切正常。

                  【讨论】:

                    【解决方案13】:

                    删除//= require_tree 只会阻止您的javascript 文件被加载到rails 中。它可能会停止错误,但可能不是你想要的。

                    但是,就我而言,我有一些 .js.coffee 文件缩进不正确。一旦我解决了这个问题(通过删除它们),它就起作用了。

                    【讨论】:

                      【解决方案14】:

                      添加 gem 'therubyracer' 解决了这个问题。 只有在通过

                      添加外部 js 文件后我才收到错误消息

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 2011-09-18
                        • 2015-11-05
                        • 1970-01-01
                        • 1970-01-01
                        • 2011-09-23
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多