【问题标题】:Use Rails Sprockets directives when rendering js from controller从控制器渲染 js 时使用 Rails Sprockets 指令
【发布时间】:2014-06-27 06:24:44
【问题描述】:

我想从控制器渲染一个 .js.coffee 视图,其中包含来自 lib/assets/javascripts 目录的另一个 js 文件:

#= require doc_ready

为什么视图由控制器而不是静态资源呈现?

因为我想通过绝对 url 引用文件,所以不会改变。 Rails 4.0 只编译带有像 embed-dc589fbef3832d9c38a4fbbc4b021f59.js 这样的摘要的资产,并且我想使用相同的 url(并且可能根据时间使缓存文件过期),即使我对脚本进行了更改。

为什么是绝对网址?

因为我想在另一个网站外部使用脚本,我给那个网站站长的代码不能改变。

我为什么要在资产中包含另一个 js?

  1. 保持代码干燥
  2. 需要一个模拟 jquery 就绪事件的simple library,用于在包含脚本的页面上创建小部件。

我是否可以通过制作一个呈现.js.coffee 视图的控制器操作来实现这一点,该视图从库中编译并包含其他所需的 js 文件,就像 sprocket 在编译资产时所做的那样?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 coffeescript asset-pipeline sprockets


    【解决方案1】:

    像这样使用重定向:

      def show
        redirect_to view_context.javascript_path('embed.js.coffee')
      end
    

    有一种方法可以渲染整个js文件:

    def show
      render text: Rails.application.assets.find_asset('embed.js.coffee').body
    end
    

    【讨论】:

    • 重定向,AFAIK,不适用于脚本标签源(这是我正在尝试做的)
    • 我对渲染资产文件的方式更感兴趣(当然,没有与资产服务器建立另一个连接的开销,我想从 app/assets 文件夹中即时编译它)
    • 好的,我做了一些搜索,显然重定向按预期工作,它只是让请求变慢
    【解决方案2】:

    我设法找到了一种方法,使用this answer

    控制器保持不变:

    class Widgets::EmbedJsController < ActionController::Base
    
      def embedded_script
    
      end
    
    end
    

    在咖啡脚本视图中,我“需要”另一个文件,如下所示:

    `<%= raw Rails.application.assets['doc_ready'].body %>`
    

    似乎可以在本地工作,我很快就会在生产环境中进行测试。

    这也可以通过直接从控制器提供Rails.application.assets['widgets/embed'].body 来重构,它应该编译coffeescript 但尚未对其进行测试。

    【讨论】:

      【解决方案3】:

      另一种方法是将资产的摘要版本符号链接或复制到某个恒定路径(并将其提供给第 3 方)。这样做的好处是请求根本不应该遇到问题(因为这些请求应该由 Web 服务器直接提供。

      自动化这个相对简单——我知道有两个库可以做到这一点

      【讨论】:

        猜你喜欢
        • 2019-07-12
        • 1970-01-01
        • 2015-08-03
        • 2013-04-01
        • 2016-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-04
        相关资源
        最近更新 更多