Определение частичного в активах
-
27-10-2019 - |
Вопрос
Я использую Ruby на Rails 3.1, и мне интересно, как я могу сделать частичный в активе JavaScript.
То, к чему я стремлюсь:
# in /app/assets/javascript/cart.js.coffee.erb
$('a.add_sth').click -> $('.random_container').append('<%= render partial: 'way/to/partial' %>')
Это вызывает нометодеррок:
undefined method `render' for #<#<Class:0x007fc54584c6e8>:0x007fc5474cd470>
Если я напишу <%= 2+3 %>
Вместо этого он работает нормально, кстати.
Я думаю, что проблема в том, что конвейер активов не зависит от ActionView по умолчанию, и поэтому render()
там неизвестно. В любом случае, есть ли способ отображать контент этого частичного?
Решение
Плохие новости, рендеринг недоступен: Тот же вопрос о GitHub
Другие советы
Помните, что активы предназначены для статических данных, таких как CSS, JS или изображения, которые не будут динамически изменять его содержимое, поэтому они могут быть лучше кэшированы и/или экспортированы в CDN.
Поскольку вам разрешено запустить ERB с кодом Ruby, он всегда должен возвращать одно и то же значение (поскольку оно будет выполняться только при составлении актива).
Вот почему я думаю оказывать недоступен внутри активов (хотя это может быть должным образом использовано для отображения статических данных).
Легкое решение здесь: Переместите свой файл JS в представление, Там вы сможете использовать любого помощника.
Это сработало для меня. (для Хэмла)
= 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
В рельсах 4.2
Я нашел этот пост https://github.com/sstephenson/sprockets/issues/90который предполагает использование < % require_asset 'path/to/file' %>
Это сработало для меня.
У меня была похожая проблема, поэтому я написал это render
Метод, который можно использовать внутри активов для рендеринга Эрб Частичный шаблон:
# 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
На самом деле, это работает для меня. Вам нужно сделать:
= render 'way/to/partial'
где «путь/до/частично» является относительным путем в папке существующих активов. Проводная вещь в том, что на пути вам нужно опустить папку первого уровня под активами.