Rails 请教关于 assets 如何只包含必要的 js

milk · 2013年03月10日 · 最后由 Zernel 回复于 2013年03月11日 · 5510 次阅读

找了几个教程看了,自己也试了试,感觉还是云里雾里 以 JS 为例

1.一用 require_tree,就把所有的 JS 都包含进去了 2.试着用 javascript_include_tag,发现用 rake assets:precompile 的时候,几个文件并没有合并到一起 3.使用 rails g controller foo 的时候,会自动生成一个和 controller 相同的 JS,但是一般页面,应该是一个 controller 下的各个 action 页面,包含的 JS 应该是不一样的

我现在是头疼了,麻烦大家给举个例子吧 比如,整个网站,所有页面都是要用到 jquery 的 然后,/book/add 页面下,需要包含 foo.js 和 bar.js 两个 js 这样的话,最终应该是 jquery.js,foo.js 和 bar.js 三个 JS 文件被包含,使用 rake assets:precompile 后,应该会生成这三个 JS 文件合并后的一个新 JS 文件,对否?

那么,我到底要怎么去写这个引用 JS 的语句?写在哪,application.js??

万分感谢,能帮我把上面的例子说明 一下,或者,资料也行,谢谢了

看过,本来以为自己弄清楚了,一试,又糊涂了😓

给个实例

▾ app/
  ▾ assets/
    ▸ images/
    ▾ javascripts/
      ▾ dashboard/
        ▸ accounts/
        ▾ articles/
            edit.js
            index.js
        ▸ books/
        ▸ profiles/
      ▸ editor/
      ▾ sitewide/
          alert_messages.js
          dropdown.js
          highlight.js
          jquery.cookie.js
          modal.js
          page_ready.js
          rails.validations.js
        dashboard.js
        editor.js
        site.js

预编译顶层的三个 js,dashboard.js, editor.js, site.js,分别对应三个 layout,每个 layout link 一个 js。

dashboard.js 的头

//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require mousetrap
//= require_tree ./sitewide
//= require_tree ./dashboard

sitewide 本来打算放全局都要用的 js,后来发现里面有些 js 也不是全局需要的,改名 lib 更好。

js 全部打包在一起,怎么区分不同 action 的逻辑

if ($('body#articles-edit').length) {
  // code for ArticlesController#edit
}

layout

body id=("#{controller_name}-#{action_name}")

如果再加上 Turbolink 可能更难理解了。

预编译哪个 js 是要设置的,在 config/environments/production.rb 里面

config.assets.precompile += %w( dashboard.js editor.js site.js )

dashboard layout 里面引用

= javascript_include_tag "dashboard"
需要 登录 后方可回复, 如果你还没有账号请 注册新账号