我正在使用Rails 4.2.6和Ruby 2.2.4p230。
我正在做Ruby on Rails 4 Essential Traning教程,所以我是Ruby on Rails的新手。
我在/ assets / javascripts文件夹中定义了一个简单的JavaScript函数。 加载应该调用该函数的页面时,它什么都不做。它应该显示警报。 我检查了JavaScript控制台并显示了ReferenceError:未定义jsRoar。
我在/ assets / javascripts中有一个名为public.js的清单文件,我需要demo.js文件:
//= require demo
和/ assets / javascripts中的demo.js文件定义了jsRoar函数:
function jsRoar(name) {
alert('I am ' + name + '. Hear me roar!');
}
然后我在/views/layouts/application.html.erb中包含一个帮助器的清单文件:
<%= javascript_include_tag('public') %>
最后我尝试使用
在/views/demo/index.html.erb文件中运行它<%= link_to('Roar', '#', :onclick => "jsRoar('JavaScript'); return true;") %>
和
<%= javascript_tag("jsRoar('Rails');") %>
我尝试直接使用JavaScript,如
<%= javascript_tag("alert('blah blah blah')") %>
并且有效。
为什么JavaScript控制台说没有定义jsRoar?我的Rails版本可能有问题吗?本教程使用Rails 4.0.0。
@EDIT我的天哪,对不起,我写道我使用的是Rails 2.4.6而不是4.2.6
更多信息:
在控制台中我得到:
Started GET "/assets/demo.self-877aef30ae1b040ab8a3aba4e3e309a11d7f2612f44dde450b5c157aa5f95c05.js?body=1" for ::1 at 20 16-04-02 20:00:50 +0200)
Started GET "/assets/public.self-1d8e221ce33ae6895c0dc108af782be06d67eee7ddcbbe39856d455f5c5c4ce1.js?body=1" for ::1 at 2016-04-02 20:00:50 +0200
当我在开发模式的浏览器中检查demo.self - (...)。js的来源时,有:
(function() {
}).call(this);
在public.self - (...)。js我有:
// This is a manifest file that'll be compiled into application.js, which will include all the files
// listed below.
// (...)
// Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
// about supported directives.
//
并且没有// =需要演示
@EDIT 2
好的,我设置了一个新的应用程序并将所有这些文件放在那里,我收到了一个错误:
Sprockets::Rails::Helper::AssetNotPrecompiled in Demo#index
Showing c:/(...)/testing/app/views/layouts/application.html.erb where line #6 raised:
Asset was not declared to be precompiled in production.
Add `Rails.application.config.assets.precompile += %w( public.js )` to `config/initializers/assets.rb` and restart your server
我想我在原始应用中也遇到了这个错误。 当我添加资产声明时,JavaScript函数不像以前的应用程序那样工作。
@EDIT 3
我又回到了Rails,我仍然在 Rails 5 中遇到此问题。我发现另一件事就是demo.coffee中的东西正在转向JavaScript并且在网站上工作(曾经且只有当网站加载但我认为这是我后来会发现的涡轮问题)。我猜demo.js文件有问题。这就像那里的代码没有被处理到服务器中。我确实检查了网络控制台并且demo.self已加载到那里,但正如我所说的文件仍然只有这个
(function() {
}).call(this);
我到底做错了什么?这次我非常仔细地阅读了教程。