2011-09-07 9 views
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() неизвестно. Во всяком случае, есть ли способ получить контент частичного контента?

ответ

5

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

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

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

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

0

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

= render 'way/to/partial' 

где «путь/к/частичное» является относительный путь в папке существующих активов. Проводная вещь заключается в том, что на пути вам нужно опустить папку первого уровня под активы.

+0

Что? Как может быть, что предоставление другого параметра методу, который делает его доступным? У вас есть рабочий пример? – ZedTuX

0

Это сработало для меня. (Для 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 
1

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

 Смежные вопросы

  • Нет связанных вопросов^_^