Rails 3.1与application.html.erb中的javascript_include_tag问题

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

ActionView::Template::Error ( (in /home/me/dev/ruby/demo1/app/assets/javascripts/say.js.coffee)): 3:  4: Demo1 5:  6:  7:  8:  9:  app/views/layouts/application.html.erb:6:in `_app_views_layouts_application_html_erb___558576499_89622220' 

application.html.erb的问题在于:

  

当我使用Rails 3.0创建应用程序时,这个特定的行是:

  

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

我似乎无法在谷歌周围发现任何事情,我想因为Rails 3.1刚刚发布。

顺便说一下,我正在关注使用Rails的Agile Web开发的第一章(第4版)更新为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/ 

好的,我已经弄清楚问题是什么,所以我会回答我自己的问题。

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

 //= require_tree . 

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

希望这可以帮助。 如果有人可以提供一些见解,为什么下划线导致问题会很好。

我刚开始使用新的RoR 3.2.1应用程序时遇到了这个问题。 问题是你缺少一个JS运行时,这是因为该行

 # gem 'therubyracer' 

你的Gemfile中有#在它前面。 上帝只知道为什么他们发送Rails并注释该行,因为任何使用generate scaffold或类似的教程都会导致资产编译过程绊倒生成的coffeescript文件。

解决方案是取消注释该行。 安装另一个JS运行时也可以解决问题。 请参阅例如ExecJS,但找不到JavaScript运行时 。

铁轨指南上的官方ruby说:

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

只需从application.js删除2行即可

//= require turbolinks

//= require_tree

我在运行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 %> 

希望有所帮助

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

为了未来的Google员工的利益,我去了一个试图安装therubyracer的兔子洞,直到我偶然发现这个相关post:

使用javascript_include_tag在rails 3.2.8引擎中执行ExecJS :: RuntimeError

提到的链接解释说,对于Windows 8开箱即用,ExecJS配置不正确。 特别是,pottsk描述的解决方法为我做了诀窍。

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

它涉及在%rubyinstall%\gems\2.0.0\gems\execjs-2.0.1\lib\execjs\runtimes.rb cscript可执行文件的方式:

 # 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 ) 

不言而喻,这不是一个永久的解决方案,但它确实让我开始运行,直到补丁被合并。

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

但是,在我的情况下,我有一些不正确缩进的.js.coffee文件。 一旦我修复了这个(通过删除它们),它就可以了。

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

rails取决于actionpack,它取决于链轮,这取决于json和倾斜

和倾斜取决于yajl-ruby

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

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

apt-get install nodejs

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

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

 devise_scope :user do get 'sign_out', :to => 'devise/sessions#destroy', :as => :destroy_user_session end 

如果您的routes.rb具有以上行,则只需将其删除并运行即可。 这是纠正我的问题的原因。

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

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

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

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

如果删除此行有任何缺点,请更新我

谢谢

我在Rails 4中遇到了这个问题,如果我将其切换为’defaults’而不是’application’,它就会起作用,就像OP所说的那样。 但这是一个我不想编辑的外部gem。 我发现如果我强制我的Gemfile使用版本1.8.0的coffee-script-source,进行捆绑安装,然后启动服务器,那么一切正常。

添加gem’therubyraracer’解决了这个问题。 我只是在通过<%= javascript_include_tag%>添加外部js文件后才收到错误