【问题标题】:How do you limit CoffeeScript (or JavaScript) execution to a particular controller and action in Rails 3.1?在 Rails 3.1 中,如何将 CoffeeScript(或 JavaScript)的执行限制为特定的控制器和操作?
【发布时间】:2011-09-02 12:34:06
【问题描述】:

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

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

还是我完全错误地处理了这个问题?

【问题讨论】:

  • stackoverflow.com/questions/6133235/… 的可能重复项;在那里查看我的答案。
  • 谢谢特雷弗;使脚本以 body 标记上存在的元素或特定 CSS 类为条件似乎是一个不错的方法。

标签: javascript ruby-on-rails coffeescript


【解决方案1】:

为什么不将特定控制器的 javascript 作为视图放在该控制器上(因为它们在所以特定时对应)?

如果它们足够通用,您可以使用类、ID 或数据 (html5) 标记您的视图,并让您的 javascript 查找它们(这样您就可以重用您的代码)。

【讨论】:

  • 这是一个很好的问题,它帮助我意识到我真正的问题。我真正追求的是使用 CoffeeScript,我的理解是,这只能(自动)通过资产管道获得。换句话说,我想要一些用于非常具体的控制器/动作的 CoffeeScript,但我知道如何使用 CoffeeScript 的唯一方法是通过资产管道,该管道将包含每个页面的脚本。
【解决方案2】:

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 感兴趣,Trevor 正在编写一本看起来非常不错的书:http://pragprog.com/titles/tbcoffee/coffeescript

【讨论】:

【解决方案3】:

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

content_for :js do
    javascript_include_tag "myscript"
end

【讨论】:

    【解决方案4】:

    将coffeescript 限制在特定视图的一种方法是为相关的javascript 制作一个自定义的sprockets 文件,其格式类似于application.js。假设你称之为 extras.js。

    //= 需要 my_code.js.coffee

    然后使用javascript_include_tag "extras" 将该代码包含在您想要的视图中,方法是为这些视图制作自定义布局,或者使用 content_for()

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

    【讨论】:

      【解决方案5】:

      如果您在咖啡脚本中为您的变量使用 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);
      

      【讨论】:

        猜你喜欢
        • 2011-11-10
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 2011-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多