从控制器渲染js时使用Rails Sprockets指令

时间:2014-05-09 13:27:44

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

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

#= require doc_ready

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

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

为什么是绝对网址?

因为我想在其他网站上外部使用该脚本,并且我提供给该网站的网站管理员的代码不得更改。

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

  1. 保持代码DRY
  2. 要求simple library模拟jquery ready事件,用于在包含脚本的页面上创建窗口小部件。
  3. 我是否可以通过制作一个.js.coffee视图的控制器操作来实现这一目标,该视图从库中编译并包含其他所需的js文件,就像编译资产时sprocket一样?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

控制器不受影响:

class Widgets::EmbedJsController < ActionController::Base

  def embedded_script

  end

end

在coffeescript视图中,我有&#34;要求&#34;像这样的另一个文件:

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

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

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

答案 2 :(得分:0)

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

自动执行此操作相对简单 - 我知道这两个库是