Rails 3.1与application.html.erb中的javascript_include_tag有关

时间:2011-09-02 10:04:05

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

我创建了一个简洁的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: <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的新功能。

我似乎无法在谷歌周围发现任何事情,我想因为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/

14 个答案:

答案 0 :(得分:33)

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

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

//= require_tree .

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

希望这会有所帮助。如果有人能够提供一些见解,说明为什么下划线导致问题会很棒。

答案 1 :(得分:7)

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

# gem 'therubyracer'
你的Gemfile中的

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

解决方案是取消注释该行。安装另一个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上调查所有支持的运行时。

答案 2 :(得分:3)

只需从application.js

中删除2行即可

//= require turbolinks

//= require_tree

答案 3 :(得分:2)

我在运行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 :(得分:2)

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

答案 5 :(得分:2)

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

ExecJS::RuntimeError in rails 3.2.8 engine with javascript_include_tag

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

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

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

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

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

答案 6 :(得分:1)

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

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

答案 7 :(得分:0)

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

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

并且倾斜取决于yajl-ruby

然而,不知何故,似乎没有安装许多相关的宝石!?

答案 8 :(得分:0)

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

apt-get install nodejs

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

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

答案 9 :(得分:0)

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

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

答案 10 :(得分:0)

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

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

答案 11 :(得分:0)

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

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

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

由于

答案 12 :(得分:0)

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

答案 13 :(得分:0)

添加宝石&#39; therubyracer&#39;解决了这个问题。 我通过&lt;%= javascript_include_tag%&gt;添加外部js文件后才收到错误