Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于Javascript的Rails 3.1资产管道_Javascript_Ruby On Rails 3_View_Asset Pipeline_Sprockets - Fatal编程技术网

用于Javascript的Rails 3.1资产管道

用于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('

好的,我已经阅读了很多关于Rails3.1的新资产管道的信息,我找不到一个正确的答案来回答我的疑问

我是根据视图加载我的.js文件的#动作我是按需呈现的。我这样做是为了防止不正确的绑定和加载小的.js文件

候选人机会#指数

$(".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

如果要将其更新到管道中,您有几个选项。您可能应该考虑管道的工作方式来决定

广义地说,he管道的目标是将所有JS连接到一个文件中并对其进行细化/压缩。这样做的目的是减少每页的请求数,并允许设置将来的头,以便将资源缓存在浏览器中或透明代理/缓存中的某个位置

关于选项

1。和你现在一样。

你可以继续做你知道的事情。我假设您正在使用rails帮助程序在主布局文件中添加这些视图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)正是我本该做的。我们不是都喜欢数据属性吗?:)