如何将CoffeeScript(或JavaScript)执行限制在Rails 3.1中的特定控制器和操作?

新的Rails 3.1资产管道非常好,但由于所有CoffeeScript(或JavaScript)文件都被融合到每个页面中包含的单个文件中,因此它提出了这个问题:

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

还是我完全以错误的方式接近这个?

Trevor Burnham在这里很好地回答了这个问题: 如何将CoffeeScript文件与视图相关联?

他说:

有两种常见的方法:

  1. 使行为以特定元素的存在为条件。 例如,运行注册表的代码应该以类似的方式开头

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

  2. 使行为以body元素上的类为条件。 您可以使用ERB设置主体类。 这通常也适用于样式表。 代码就像是

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

如果你对CoffeeScript感兴趣,Trevor正在编写一本看起来非常好的书: http : //pragprog.com/titles/tbcoffee/coffeescript

将coffeescript限制为特定视图的一种方法是为有问题的javascript创建自定义sprockets文件,其格式类似于application.js。 假设你称之为extras.js。

// =需要my_code.js.coffee

然后使用javascript_include_tag "extras"将代码包含在所需的视图中,方法是为这些视图创建自定义布局,或者使用content_for()

顺便说一句,您的问题表明rails管道强制您将所有js资产放在一个文件中。 这不是真的。 这通常有效避免多次往返,但您可以拥有多个链轮文件。

为什么不把特定控制器的javascript作为一个视图放在这个控制器上(因为它们对应于那里是否如此具体)?

如果它们是普通的enaugh,您可以使用类,ID或数据(html5)标记您的视图,并使您的javascript查找(因此您可以重用您的代码)。

我通常做的是获得一个yield:js在我的布局中的javascripts下,当我需要一个特定的脚本时,我直接从我的视图加载它:

 content_for :js do javascript_include_tag "myscript" end 

如果您在咖啡脚本中使用gon gem用于vars,则可以使用以下模式:

为控制器中的每个操作添加一个标志:

  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);