随便举个例子,假如是 app/assets/javascripts/aaa.js 然后只有 aaa.html.erb 需要 最重要的是,里面有一段类似
$(document).ready(function() {
update_something();
});
这种 ready 后就要执行的东西。 而 rails 会把所有的 js 合在一起,那么别的页面上运行这个 update_something() 的时候就会报错。 大家一般怎么处理?
#2 楼 @fresh_fish 拿楼主的 app/assets/javascripts/aaa.js 做例子,文件名改成 aaa.js.erb,然后就可以在文件里面 <%= Rails.env.production? ? 'serious' : 'crazy' %> 了
另一种方式就是页面提供一个全局变量,在 View 里头用 <%= javascript_tag %> 输出出来,然后在 js 代码中判断就行
添加 config.assets.precompile = ['.js', '.css'] http://stackoverflow.com/questions/7278029/rails-3-1-asset-precompilation-include-all-javascript-files
我们是这样做的:每个单独的界面(不是页面)都给一个独立 ID。为这个界面创一个独立文件。
CoffeeScript 大概是这个架构
# my-widget.js.coffee
id = "my-widget"
if $(id).length > 0
init($(id))
init = ($e) ->
# your code here
asset-pipeline 我们分成两个档案,一个叫 libs.coffee, 一个叫 apps.coffee
libs 包含 jquery, jquery-ui, underscore, backbone 等等不常变动的文件。
app 包含所有应用的文件。
这样可以帮助缓存。libs 几乎不会变,app 每次变动需要用户更新。目前我们的 libs 大概有 70~80kb gzipped-compressed, app 大概只有 5~6kb
@hayeah 我们也是这么做的
$(document).ready ->
return true if $("#id").length == 0
......
以 Controller 为主,一个 Controller 一个 JS 文件,就算某些独立页面需要的,也统一放到 Controller 的 JS 里面
layout 上加<%= yield :js %>
aaa.html.erb 上加這個
<%= content_for :js do %>
<%= javascript_include_tag "aaa" %>
<% end %>
我一直是分开的,目录类似
├── site
│ └── works.js
└── modules
└── avatar.js
modules 下放公共的 js 模块 site 下放实际页面中引用的 js,并且通常是 per action 的,例如我的项目里有个 work 类型,则在它的列表页会有 works.js,在详情页有 work.js,表单页则是 work_form.js(因为 new 和 edit 页面都会要)
然后,在 config/application.rb
里,记得告诉 sprocket 压缩 site 下的文件:
config.assets.precompile += [/site\/\w+\.js/]
我和@huacnlee 的做法是类似,基本上也是按照 controller 分类,我会更细一点,基本上保证上服务器以后,application.js 编译一个文件,然后再有针对当前页面的独立的 js 编译成另一个文件