7

我正在使用 Ruby on Rails 3.1,我想知道如何在 javascript 资产中呈现部分内容。

我的目标是:

# in /app/assets/javascript/cart.js.coffee.erb
$('a.add_sth').click -> $('.random_container').append('<%= render partial: 'way/to/partial' %>')

这会导致 NoMethodError:

undefined method `render' for #<#<Class:0x007fc54584c6e8>:0x007fc5474cd470>

如果我改写<%= 2+3 %>它,它工作正常,顺便说一句。

我认为问题在于资产管道独立于默认的 ActionView ,这就是render()那里未知的原因。无论如何,有没有办法渲染部分内容?

4

6 回答 6

8

坏消息,渲染不可用看:GitHub 上的相同问题

于 2011-10-06T13:50:22.760 回答
5

请记住,资产用于静态数据,例如不会动态更改其内容的 CSS、JS 或图像,因此可以更好地缓存和/或导出到 CDN。

由于您可以使用 ruby​​ 代码运行 ERB,因此它应该始终返回相同的值(因为它只会在编译资产时执行)。

这就是为什么我猜渲染在资产内部不可用(尽管它可以正确地用于渲染静态数据)。

这里的简单解决方案:将您的 JS 文件移动到一个视图,在那里您将能够使用任何视图助手。

于 2011-12-02T22:20:36.967 回答
1

这对我有用。(对于 HAML)

= Haml::Engine.new(File.read(File.join(Rails.root, 'app/views/xxxxx','_form.html.haml'))).render(Object.new, :hello => "Hello World")

并且,需要在要更新的文件的开头添加依赖项,例如:在这种情况下,依赖的文件需要在资产中。

//= depend_on xxxxx/_form.html.haml
于 2014-07-11T03:19:07.490 回答
1

在轨道 4.2 中

我发现这篇文章https://github.com/sstephenson/sprockets/issues/90 建议使用 <% require_asset 'path/to/file' %>

这对我有用。

于 2016-01-14T18:44:24.063 回答
1

我有类似的问题,所以我写了这个render方法,可以在资产内部使用来渲染ERB部分模板:

# in lib/my_app/erb_helpers.rb
module MyApp
  module ERBHelpers
    class << self

      def render(partial_path, binding)
        dir_name, _, partial_name = partial_path.rpartition(File::SEPARATOR)
        file_name = "_#{partial_name}.html.erb"
        Erubis::Eruby.new(File.read(File.join(Rails.root, 'app', 'views', dir_name, file_name)).gsub("'", %q(\\\'))).result(binding)
      end

    end
  end
end

然后我在coffeescript文件中使用它,如下所示:

# in app/assets/javascripts/notifications.coffee
MyApp.notifications.templates =
  notice: '<%= ::MyApp::ERBHelpers.render 'application/notifications/notice', content: "%content%" %>'
  alert: '<%= ::MyApp::ERBHelpers.render 'application/notifications/alert', content: "%content%" %>'

MyApp.notifications.create_elem = (type, content) -> MyApp.notifications.templates[type].replace('%content%', content)

PS:我在 Rails 5.0 应用上测试过

于 2016-09-14T12:35:42.667 回答
-2

事实上,它对我有用。你需要做:

= render 'way/to/partial'

其中 'way/to/partial' 是现有资产文件夹下的相对路径。有线的事情是,在路径中,您需要省略资产下的第一级文件夹。

于 2012-11-25T19:32:35.050 回答