Rails 3.1 Javascript的资产管道

Raf*_*ira 5 javascript view ruby-on-rails-3 sprockets asset-pipeline

好的,我已经阅读了很多关于新资产管道Rails 3.1的信息,我找不到对我的怀疑的正确答案.

我根据我正在渲染的视图#动作按需加载我的.js文件.我这样做是为了防止不正确的绑定并加载小的.js文件.

candidate_opportunities#指数

$(".sortable_drag_n_drop").sortable({
    update: function(event, ui) {
        $.post('/candidate_opportunities/sort', $(this).sortable('serialize'));
    },
    handle: 'span'
});
Run Code Online (Sandbox Code Playgroud)

candidate_companies#指数

$(".sortable_drag_n_drop").sortable({
    update: function(event, ui) {
        $.post('/candidate_companies/sort', $(this).sortable('serialize'));
    },
    handle: 'span'
});
$(".sortable_drag_n_drop").disableSelection();
Run Code Online (Sandbox Code Playgroud)

现在最好的解决方案是什么?

  • 我应该更改我的绑定并让Sprockets使用//= require_tree .?编译我的所有.js文件?
  • 或者我应该根据我的观点尝试加载我的 .js,所以我最终没有一个巨大的 application.js

Ric*_*lse 6

如果要将此更新到管道,您有几个选项.您应该采取管道在决定时应该考虑的方式.

从广义上讲,他管道的目的是将所有JS加入到一个文件中并对其进行minfy/compress.这样做的目的是减少每页请求的数量,并允许设置远期标头,以便在浏览器或透明代理/缓存中的某个位置缓存资源.

关于选项.

1.和你现在一样.

你可以继续做你知道的同样的事情.我假设您正在使用rails助手在主布局文件中添加这些视图JS文件.您可以继续对管道执行相同操作,但是您必须将所有使用的文件添加到预编译数组中:

config.assets.precompile += ['candidate_opportunities.js', 'candidate_companies']

资产必须位于assets/javascripts中,但不需要将它们添加到清单文件中,因为您要单独添加每个资产.

强烈建议您坚持使用管道的Rails默认值并预编译资产以进行生产.

缺点是这些页面上的额外请求,但如果应用程序处于高负载状态,这只是一个问题.

2.资产管道方式(TM)

要使用管道执行此操作,您需要将这些文件移动到assets/javascripts中,require_tree正如您所说.

在您的情况下,问题是JS片段针对同一个类(但具有不同的帖子URL),因此这不起作用.使用require_tree,文件的顺序可能不是您想要的.

一个新的3.1应用程序为视图生成文件(我认为),但期望它们将在标记中定位唯一属性(从站点的角度来看),因为所有文件都包含在application.js中

解决JS冲突的问题.我建议你重构JS片段,以便它更通用.您可以data-post-url在可排序对象上使用 属性:

<ul class="sortable_drag_n_drop" data-post-url="/candidate_opportunities/sort">

然后收集JS中的url.

不仅是DRYer,而且整体JS总体较少,并且可以按预期完全使用管道.