在 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
是库应该去的地方,我同意这个组织。
- 保留
/public
目录只是为了向后兼容我所读的内容(它甚至不再默认创建)
你可以把 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
中。
我正尝试在 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
是库应该去的地方,我同意这个组织。
- 保留
/public
目录只是为了向后兼容我所读的内容(它甚至不再默认创建)
你可以把 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
中。