我理解“为什么”所有js / css文件都包含在rails资产管道中的“原因”部分,如here所述。
然而,这并不总是可取的,是吗?例如,我有一个非标准布局,我只是用来显示需要谷歌地图的项目。我不希望所有页面都包含所有外部gmap库 - 这不是必需的,而且只是浪费 - 但如果我不在每个页面上都包含它们,那么map.js.coffee
中对google api的调用文件会抛出错误。
有没有办法在map.js.coffee
视图上强制maps
仅显示?
答案 0 :(得分:1)
有一个解决方案,javascript_include_tag
:
# assets/javascripts/
# user.js.coffee
# form.js.coffee
# map.js.coffee
# views/users/location.html.haml
= javascript_include_tag 'map'
但是在//= require_tree .
中定义assets/application.js
确实包含了所有JS文件,我是对的吗?
这样做会包含两次文件,对吗?
更新:关注此RailsCast(http://railscasts.com/episodes/279-understanding-the-asset-pipeline)我们可能能够创建一个包含所有“共享”js文件的公用文件夹,并且需要它://= require_tree ./public
< / p>
答案 1 :(得分:1)
要结合其他答案所建议的内容以及网上建议的其他来源,似乎对这种情况的最佳答案是执行以下操作:
在assets/javascripts
和assets/stylesheets
目录以及maps.js
和maps.css
文件中创建子目录。在我上面的例子中你有
app/
assets/
javascripts/
application.js
maps.js
maps/
site/
stylesheets/
application.css
maps.css
maps/
site/
在这些目录中创建任何所需的特定于页面的javascripts / stylesheets。
maps.js
文件看起来像:
//= require_tree ./maps
将包含maps目录/子目录中的所有项目。
application.js
是相同的,但包含“主要”网站资源以及任何特定于网站的项目:
//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require bootstrap
//= require_tree ./site
创建一个名为views/layouts/maps.html.erb
的地图布局文件,并在布局文件中,使用javascript_include_tag
更改要解析的包含以下内容的js / css文件:
视图/布局/ maps.html.erb:
<%= stylesheet_link_tag "maps", media: "all", "data-turbolinks-track" => true %>
<%= javascript_include_tag "maps", "data-turbolinks-track" => true %>
视图/布局/ application.html.erb:
<%= stylesheet_link_tag "application", media: "all", "data-turbolinks-track" => true %>
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>
确保MapsController
指定地图布局!
class MapsController < ApplicationController
layout "maps"
答案 2 :(得分:0)
注意application.html.sim中的行:
= javascript_include_tag "application"
您希望在不同的布局map.html.slim中包含一组不同的javascripts,然后创建另一个javascript文件,例如map.js.coffee,并且在此文件中只包含您需要的文件。现在布局文件需要使用此
= javascript_include_tag "map"