为什么资产管道不能找到我的JQuery?

时间:2012-10-15 11:28:28

标签: jquery ruby-on-rails haml asset-pipeline

我正在尝试在Rails 3.2.8应用程序中使用JQuery插件。

相关代码如下......

/app/views/layouts/application.html.haml文件中:

!!!
%html
  %head
    = javascript_include_tag :defaults
    = javascript_include_tag '/assets/nospam.js'

/public/javascripts/application.js文件中:

//= require jquery
//= require jquery_ujs
//= require jquery.ui.all
//= require nospam

/app/assets/javascripts/nospam.js文件中:

$('#my-email').html(function(){
  var e = "me";
  var a = "@";
  var d = "mysite";
  var c = ".com";
  var h = 'mailto:' + e + a + d + c;
  $(this).parent('a').attr('href', h);
  return e + a + d + c;
});

/app/views/layouts/index.html.haml文件中:

%p
We love email, so why not send a message to
%a{:href => "#"}
  %span#my-email please enable javascript to view
and let us know what's on your mind.

Gemfile

gem 'jquery-rails'

group :assets do
  gem 'jquery-ui-rails'
end

我已经运行了bundle install并重新启动了服务器,但该插件无效,而且在Chrome的Javascript控制台中我收到此错误:

GET http://localhost:3000/assets/nospam.js 404 (Not Found) 

rails console中,我得到:

Rails.application.config.assets.paths
 => ["/Users/steven/Dropbox/testivate/app/assets/javascripts", "/Users/steven/Dropbox/testivate/app/assets/stylesheets", "/Users/steven/Dropbox/testivate/vendor/assets/javascripts", "/Users/steven/.rvm/gems/ruby-1.9.3-p194/gems/jquery-rails-2.1.3/vendor/assets/javascripts"] 

我现在通过禁用资产管道来解决这个问题,但我知道我应该出于性能原因最终重新启用它。

我该怎么做才能让它发挥作用?

谢谢,

史蒂芬。

2 个答案:

答案 0 :(得分:3)

取出界限:

<强> /app/views/layouts/application.html.haml

= javascript_include_tag '/assets/nospam.js'

nospam.js文件已经编译到application.js文件中,因此不需要单独包含它。

此外,您需要确保您的JQuery代码在它引用的html之后执行,因此添加一个$(document).ready行,如下所示:

<强> /应用/资产/ Javascript角/

$(document).ready(function () {
  $('#my-email').html(function(){
    var e = "me";
    (etc...)

答案 1 :(得分:0)

我的猜测:

资产管道将app/assets目录编译为public目录。

由于您的application.js清单位于public/javascripts目录中,资产管道不会考虑它(资产管道不会编译公共目录中的资产,而是放置已编译资产的位置)。所以将其移至app/assets/javascripts/application.js

您在布局中所需要的只是:

= javascript_include_tag :defaults

确保nospam.js位于app/assets/javascripts/nospam.js

app/
  assets/
    javascripts/
      application.js
      nospam.js

你的清单对我来说是正确的。看起来文件不在正确的位置。