rails 4 - 始终包含所有javascripts

时间:2014-04-17 15:57:51

标签: javascript ruby-on-rails asset-pipeline

我理解“为什么”所有js / css文件都包含在rails资产管道中的“原因”部分,如here所述。

然而,这并不总是可取的,是吗?例如,我有一个非标准布局,我只是用来显示需要谷歌地图的项目。我不希望所有页面都包含所有外部gmap库 - 这不是必需的,而且只是浪费 - 但如果我不在每个页面上都包含它们,那么map.js.coffee中对google api的调用文件会抛出错误。

有没有办法在map.js.coffee视图上强制maps仅显示?

3 个答案:

答案 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/javascriptsassets/stylesheets目录以及maps.jsmaps.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"
相关问题