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

问题描述

| 新的Rails 3.1资产管道确实很棒,但是由于所有CoffeeScript(或JavaScript)文件都被合并为每个页面中包含的单个文件,因此引发了以下问题: 如何将脚本的执行限制为特定的控制器或动作?我的CoffeeScript中是否有办法知道在请求期间使用了哪个控制器和操作,以便可以在脚本中放入条件语句? 还是我完全以错误的方式走这条路?     

解决方法

Trevor Burnham在这里很好地回答了这个问题:如何将CoffeeScript文件与视图关联? 他说:   有两种常见方法:         使行为取决于特定元素的存在。对于   实例,运行签单的代码   应该以类似的东西开头      
if $(\'#signup\').length > 0
  使行为取决于
body
元素上的类。您可以   使用ERB设置身体类别。这是   通常是样式表所需要的   好。该代码将类似于      
if $(\'body\').hasClass \'user\'
   而且,如果您对CoffeeScript感兴趣,那么Trevor正在编写一本看起来非常不错的书:http://pragprog.com/titles/tbcoffee/coffeescript     ,将coffeescript限制为特定视图的一种方法是为有问题的javascript创建自定义的链轮文件,格式类似于application.js。假设您将其称为extras.js。   // =需要my_code.js.coffee 然后使用
javascript_include_tag \"extras\"
将代码包含在所需的视图中,方法是为这些视图创建自定义布局,或者使用content_for() 顺便说一句,您的问题是Rails管道迫使您将所有js资产放在一个文件中。这不是真的。这样通常可以避免多次往返,但是您可以拥有多个链轮文件。     ,为什么不将特定控制器的javascript作为该控制器上的视图放置(如果它们如此具体,则它们对应于该视图)? 如果它们是普遍的笑话,则可以使用类,id或数据(html5)标记视图,并使javascript进行查找(以便您可以重复使用代码)。     ,我通常要做的是在布局中的javascripts下包含yield:js,当我需要特定的脚本时,可以直接从视图加载它:
content_for :js do
    javascript_include_tag \"myscript\"
end
    ,如果您在咖啡脚本中将gon gem用于变量,则可以使用以下模式: 在控制器中为每个动作放置一个标志:
  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);
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...