在 Rails 中包含特定视图的外部 JS

including external JS for a specific view in Rails

我正尝试在 Rails 上使用 Ruby 来构建我的第一个网站。

我已经阅读了关于资产管道的内容,我有一个特定的视图需要引用 3 个 JS 库,其他文件不需要引用。

我不想将它们用作 assets/javascripts 清单中的 require 指令,因为它们最终会出现在不需要它们的所有其他页面上。

所以,我想我可以简单地将它们包含在视图模板中。


但是,我收到 404: 找不到文件 错误。

这就是我将它们包含在模板中的方式 /app/views/welcome/index.html.erb:

<%= javascript_include_tag "/lib/assets/javascripts/three.js" %>          
<%= javascript_include_tag "/lib/assets/javascripts/perlin.js" %>
<%= javascript_include_tag "/lib/assets/javascripts/cube.js" %>

这被呈现为 <body> 标签内的第一行(这是因为模板中的代码是根据 /app/views/layouts/application.html.erb 中的 yield 标签呈现的,而 yield标签放在 body 个标签内)

如您所见,这些文件位于 lib/assets/javascripts 中,我正在尝试使用完整路径(相对于网络根目录)访问它们。


这是在尝试呈现其中一个库时在服务器上生成的错误消息示例:

Started GET "/lib/assets/javascripts/three.js" for 127.0.0.1 at 2015-03-15 11:30:52 -0400

ActionController::RoutingError (No route matches [GET] "/lib/assets/javascripts/three.js"):
  actionpack (4.2.0) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
  web-console (2.1.0) lib/web_console/middleware.rb:37:in `call'
  actionpack (4.2.0) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
  railties (4.2.0) lib/rails/rack/logger.rb:38:in `call_app'
  railties (4.2.0) lib/rails/rack/logger.rb:20:in `block in call'
  activesupport (4.2.0) lib/active_support/tagged_logging.rb:68:in `block in tagged'
  activesupport (4.2.0) lib/active_support/tagged_logging.rb:26:in `tagged'
  activesupport (4.2.0) lib/active_support/tagged_logging.rb:68:in `tagged'
  railties (4.2.0) lib/rails/rack/logger.rb:20:in `call'
  actionpack (4.2.0) lib/action_dispatch/middleware/request_id.rb:21:in `call'
  rack (1.6.0) lib/rack/methodoverride.rb:22:in `call'
  rack (1.6.0) lib/rack/runtime.rb:18:in `call'
  activesupport (4.2.0) lib/active_support/cache/strategy/local_cache_middleware.rb:28:in `call'
  rack (1.6.0) lib/rack/lock.rb:17:in `call'
  actionpack (4.2.0) lib/action_dispatch/middleware/static.rb:113:in `call'
  rack (1.6.0) lib/rack/sendfile.rb:113:in `call'
  railties (4.2.0) lib/rails/engine.rb:518:in `call'
  railties (4.2.0) lib/rails/application.rb:164:in `call'
  rack (1.6.0) lib/rack/lock.rb:17:in `call'
  rack (1.6.0) lib/rack/content_length.rb:15:in `call'
  rack (1.6.0) lib/rack/handler/webrick.rb:89:in `service'
  /home/luke/.rbenv/versions/2.2.0/lib/ruby/2.2.0/webrick/httpserver.rb:138:in `service'
  /home/luke/.rbenv/versions/2.2.0/lib/ruby/2.2.0/webrick/httpserver.rb:94:in `run'
  /home/luke/.rbenv/versions/2.2.0/lib/ruby/2.2.0/webrick/server.rb:294:in `block in start_thread'

编辑

人们建议我移动我的文件。你能解释一下为什么我不能把它们放在 lib 中吗?文档说 lib/assets 是库应该去的地方,我同意这个组织。

你可以把 JS 文件放在 /assets/javascripts (forexample.js) 中,然后像这样在视图中调用它

  <%= javascript_include_tag 'forexample' %>

所有需要的 javascripts 文件仅与 application.js 链接,只是不包含

  <%= javascript_include_tag 'application' %>

在其他视图中。

将您的 Javascript 放入 /app/assets/javascripts 中,您将能够像这样包含它:

<%= javascript_include_tag 'file-name' %>

请注意,您不应包含扩展名。 Rails 会帮你找到的。

每个控制器都有自己的 Javascript 和 CSS 文件,使用它们是个好主意。

请注意,如果您添加更多资产,则必须将 Rails.application.config.assets.precompile += %w( [file name] ) 添加到 config/initializers/assets.rb 并重新启动服务器

Libs 并不完全如你所想,使用public一个坏主意... 正如我所说,最好只将它放在 /app/assets/javascripts 中。