javascript - 包括 Rails 中特定 View 的外部 JS

标签 javascript ruby-on-rails ruby url-routing

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

我已经阅读了有关 Assets 管道的内容,并且我有一个特定的 View ,需要引用 3 个 JS 库,而其他文件不需要引用。

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

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

<小时/>

但是,我收到 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保留目录只是为了向后兼容我所读到的内容(它甚至不再默认创建)

最佳答案

将您的 Javascript 放入 /app/assets/javascripts 中,您就可以像这样包含它:

<%= javascript_include_tag 'file-name' %>

请注意,您不应包含该扩展程序。 Rails 会为您找到它。

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

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

Libs 并不完全符合您的想法,并且使用 public 是一个坏主意...... 正如我所说,最好将其放在 /app/assets/javascripts 中。

关于javascript - 包括 Rails 中特定 View 的外部 JS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29062456/

相关文章:

ruby-on-rails - 单表继承中的 counter_cache

ruby - 正则表达式,如何精确匹配

javascript - 更新javascript中事件函数中的全局变量

javascript - 颜色随着元素的老化而变化?

ruby-on-rails - 为什么 ActionDispatch::Routing::RouteSet 需要这么长时间

mysql - 数据库特定迁移代码

ruby-on-rails - 用于检查网站是否具有搜索引擎友好 URL 的 Ruby 代码

ruby - 如何将 OpenSSL::ASN1::ASN1Data 转换为 IP 地址?

javascript - pickadate() 函数不适用于克隆元素

javascript - 在带有 codeigniter 的 PHP 5.4 中使用 session 上传进度条