用于Javascript的Rails 3.1资产管道
好的,我已经阅读了很多关于Rails3.1的新资产管道的信息,我找不到一个正确的答案来回答我的疑问 我是根据视图加载我的.js文件的#动作我是按需呈现的。我这样做是为了防止不正确的绑定和加载小的.js文件 候选人机会#指数用于Javascript的Rails 3.1资产管道,javascript,ruby-on-rails-3,view,asset-pipeline,sprockets,Javascript,Ruby On Rails 3,View,Asset Pipeline,Sprockets,好的,我已经阅读了很多关于Rails3.1的新资产管道的信息,我找不到一个正确的答案来回答我的疑问 我是根据视图加载我的.js文件的#动作我是按需呈现的。我这样做是为了防止不正确的绑定和加载小的.js文件 候选人机会#指数 $(".sortable_drag_n_drop").sortable({ update: function(event, ui) { $.post('/candidate_opportunities/sort', $(this).sortable('
$(".sortable_drag_n_drop").sortable({
update: function(event, ui) {
$.post('/candidate_opportunities/sort', $(this).sortable('serialize'));
},
handle: 'span'
});
$(".sortable_drag_n_drop").sortable({
update: function(event, ui) {
$.post('/candidate_companies/sort', $(this).sortable('serialize'));
},
handle: 'span'
});
$(".sortable_drag_n_drop").disableSelection();
候选公司指数
$(".sortable_drag_n_drop").sortable({
update: function(event, ui) {
$.post('/candidate_opportunities/sort', $(this).sortable('serialize'));
},
handle: 'span'
});
$(".sortable_drag_n_drop").sortable({
update: function(event, ui) {
$.post('/candidate_companies/sort', $(this).sortable('serialize'));
},
handle: 'span'
});
$(".sortable_drag_n_drop").disableSelection();
现在最好的解决方案是什么?
- 我是否应该更改绑定并让链轮使用
//= 需要树。
- 或者我应该试着加载我的 .js根据我的观点,我不会以一个巨大的 application.js
config.assets.precompile+=['candidate\u opportunities.js','candidate\u companys']
这些资产必须在assets/javascripts中,但不需要将它们添加到manifest文件中,因为您要逐个添加它们
强烈建议您坚持管道和生产用预编译资产的Rails默认值
缺点是在这些页面上有一个额外的请求,但这只是在应用程序处于高负载时才会出现的问题
2。资产管道方式(TM)
要使用管道执行此操作,您需要将这些文件移动到assets/javascripts和require\u tree
,如您所说
在您的案例中,问题是JS代码段的目标是同一个类(但具有不同的post URL),因此这是行不通的。使用require_tree,文件的顺序可能不是您想要的
一个新的3.1应用程序会为视图生成文件(我认为),但预期它们会以标记中的唯一属性(从站点角度)为目标,因为所有文件都包含在application.js中
解决JS冲突的问题。我建议您重构JS代码段,使其更通用。您可以在可排序对象上使用数据发布url
属性:
数据发布url=“/candidate\u opportunities/sort”>
然后在JS中收集url
不仅是干衣机,而且您的总体JS更少,可以按预期充分使用管道。我对Rails资产管道感到失望。也许不是整个资产管道的事情,但Rails组织javascript的方式确实不符合逻辑 到目前为止,Rails每个控制器都有一个单独的javascript文件。这在逻辑组织方面有点好。但是,资产管道会将所有这些文件压缩成一个大的js文件。因此,基本上你的js文件组织得很好,但是它们会一次全部加载,导致变量冲突、函数冲突、其他代码冲突和其他意外行为。因为作为开发人员,我们真正想要的是一种执行或加载页面特定javascript的简单方法 一种著名的方法是每页只包含一个特定的javascript文件。是的,这会起作用,但如果我们每页请求不同的javascript文件,我们不会使用资产管道提供的性能提升 我的解决方案是创建一个javascript对象,该对象保存所有特定于页面的函数,然后在Rails执行匹配的控制器操作对后获取并执行它们。大概是这样的:
PageJs = {};
PageJs["users/new"] = function(){
alert("I will be called when users/new action is executed");
};
基本上,这是核心思想。我已经实现了这个想法,并为此创造了一块宝石。签出并查看如何在不进行复杂设置的情况下以逻辑方式组织js文件和执行特定于页面的javascript
下面是一个关于如何使用的示例:
Javascript文件:
Paloma.callbacks['users/new'] = function(params){
// This will only run after executing users/new action
alert('Hello New Sexy User');
};
Rails控制器:
def UsersController < ApplicationController
def new
@user = User.new
# No special function to call,
# the javascript callback will be executed automatically
end
end
def userscocontroller
这只是一个简单的例子,但它提供了更多,我相信它可以解决你的问题。很容易
谢谢大家! (2)正是我本该做的。我们不是都喜欢数据属性吗?:)