Оказание частичного в активах - PullRequest
7 голосов
/ 07 сентября 2011

Я использую 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() там неизвестно.В любом случае, есть ли способ визуализировать содержимое этой части?

Ответы [ 6 ]

8 голосов
/ 06 октября 2011

Плохие новости, рендер недоступен. Смотрите: тот же вопрос на GitHub

5 голосов
/ 03 декабря 2011

Помните, что ресурсы предназначены для статических данных, таких как CSS, JS или изображения, которые не будут динамически изменять свое содержимое, поэтому их можно лучше кэшировать и / или экспортировать в CDN.

Поскольку вам разрешено запускать ERB с кодом ruby, он всегда должен возвращать одно и то же значение (поскольку оно будет выполняться только при компиляции ресурса).

Вот почему я думаю, рендер недоступен внутри ресурсов (хотя его можно правильно использовать для рендеринга статических данных).

Простое решение здесь: Переместите JS-файл в представление , там вы сможете использовать любой помощник вида.

1 голос
/ 14 сентября 2016

У меня была похожая проблема, поэтому я написал этот 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

1 голос
/ 14 января 2016

В рельсах 4.2

Я нашел этот пост https://github.com/sstephenson/sprockets/issues/90, в котором предлагается использовать <% require_asset 'path / to / file'%>

Это сработало для меня.

1 голос
/ 11 июля 2014

Это сработало для меня. (для 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
0 голосов
/ 25 ноября 2012

На самом деле, это работает для меня. Вам нужно сделать:

= render 'way/to/partial'

где 'путь / к / частям' - относительный путь в существующей папке ресурсов. Дело в том, что в пути вам нужно пропустить папку первого уровня под активами.

...