2011-05-26 49 views
9

新的Rails 3.1资产管道非常好,但由于所有CoffeeScript(或JavaScript)文件都融入到每个页面中包含的单个文件中,因此引发了以下问题:如何限制CoffeeScript(或JavaScript)执行到Rails 3.1中的特定控制器和操作?

如何限制执行我的脚本到特定的控制器或操作?在我的CoffeeScript中有没有一种方法可以知道请求期间使用了哪个控制器和动作,以便我可以将条件语句放入脚本中?

或者我完全接近这个错误的方式?

+1

可能的http:// stackoverf重复low.com/questions/6133235/rails-3-1-rc1-javascript-and-asset-pipeline;在那里看到我的答案。 – 2011-05-26 16:10:45

+0

谢谢Trevor;使脚本在body标签上存在元素或特定CSS类的条件看来是一种很好的方法。 – adamjcooper 2011-05-26 18:54:02

回答

0

为什么不把JavaScript来实现特定控制器为这个控制器上的视图(因为它们对应有如果所以具体)?

如果它们是普通的enaugh,你可以用类,id或数据(html5)标记你的视图,并让你的javascript看起来(所以你可以重用你的代码)。

+0

这是一个很好的问题,它帮助我认识到我真正的问题。 我真的在使用CoffeeScript,我的理解是,这只能通过资产管道(自动)提供。 换句话说,我想为一个非常特定的控制器/动作使用CoffeeScript,但我知道如何使用CoffeeScript的唯一方法是通过资产管道,其中包含每个页面的脚本。 – adamjcooper 2011-05-26 18:46:45

8

Trevor Burnham回答这个问题很好的位置:How do I associate a CoffeeScript file with a view?

他说:

有两种常用的方法:在一个特定元素的存在

  1. 制作行为的条件。对于 例如,代码运行注册表 应该这样来开头像

    if $('#signup').length > 0

  2. 制作行为的body元件上的类条件。您可以使用ERB 设置主体类。这是 通常需要的样式表为 。该代码会是这样的

    if $('body').hasClass 'user'

如果你有兴趣的CoffeeScript,特雷弗正在写一本书,看起来是非常好的:http://pragprog.com/titles/tbcoffee/coffeescript

+2

对于解决方案2,您可以尝试https://github.com/tonytonyjan/gistyle,它为您设置约定以供使用。 – lulalala 2014-03-04 09:29:35

0

我通常做的是有一个产量:js在我的布局javascripts下,当我需要一个特定的脚本它,我直接从我的看法加载它:

content_for :js do 
    javascript_include_tag "myscript" 
end 
1

将coffeescript限制为特定视图的一种方法是为有问题的javascript制作自定义链轮文件,格式与application.js类似。假设你称它为extras.js。

// =需要my_code.js。咖啡

然后使用javascript_include_tag "extras"包括在你想要的意见,即代码,无论是通过使这些观点的自定义布局,或使用content_for()

顺便说一句,你的问题说,该钢轨管道力量你把所有的js资产放在一个文件中。这不是真的。这通常可以避免多次往返,但您可以有多个链轮文件。

0

如果您使用的是gon宝石在咖啡脚本您的增值经销商,你可以用这个模式:

将一个标志控制器中的每一个动作:

def index 
    @gps_coords = GpsCoord.all 

    # Flag for the CoffeeScript to decide which part to run 
    gon.index = true; 
    end 

    def show 
    @gps_coord = GpsCoord.find(params[:id]) 

    gon.lat = @gps_coord.latitude 
    gon.lon = @gps_coord.longitude 

    gon.show = true; 
    end 

在相关的咖啡脚本使用这些标志来区分这两种行为:

# index action? 
    if gon.index? 
    first_coord = gon.gps_coords[0] 
    map.setView([first_coord.latitude, first_coord.longitude], 15); 

    # show action? 
    if gon.show? 
    map.setView([gon.lat, gon.lon], 15); 
相关问题