2011-09-07 35 views
7

Estoy usando Ruby on Rails 3.1 y me pregunto cómo podría representar un parcial en un activo de javascript.Renderizar un parcial en activos

Lo que estoy con el objetivo de:

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

Esto provoca una NoMethodError:

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

Si escribo <%= 2+3 %> vez que trabaja muy bien, por cierto.

Creo que el problema es que el inventario de activos es independiente del ActionView predeterminado y que por eso render() se desconoce. De todos modos, ¿hay alguna forma de obtener el contenido de ese parcial?

Respuesta

5

Recuerde que los activos son para datos estáticos, como CSS, JS o imágenes que no va a cambiar dinámicamente su contenido, por lo que puede ser mejor en caché y/o exportado a un CDN.

Dado que puede ejecutar ERB con código ruby, siempre debe devolver el mismo valor (ya que solo se ejecutará al compilar el activo).

Es por eso que supongo que muestra no está disponible dentro de los activos (aunque podría utilizarse correctamente para representar datos estáticos).

Solución fácil aquí: mueva su archivo JS a una vista, allí podrá usar cualquier asistente de visualización.

0

De hecho, me funciona. Que tiene que hacer:

= render 'way/to/partial' 

donde 'forma/a/parcial' es la ruta relativa en la carpeta activos existentes. Lo relacionado con el cableado es que en la ruta, debe omitir la carpeta de primer nivel en activos.

+0

¿Qué? ¿Cómo puede ser eso dar un parámetro diferente a un método que lo hace disponible? ¿Tienes un ejemplo de trabajo en alguna parte? – ZedTuX

0

Esto funcionó para mí. (Por HAML)

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

Y, es necesario añadir la dependencia en el inicio del archivo a ser actualizada como: En este caso, el archivo Dependía se necesita para estar en el activo.

//= depend_on xxxxx/_form.html.haml 
1

tuve problema similar, así que escribí este método render, que se puede utilizar dentro de los activos para hacer ERB plantilla parcial:

# 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 

Luego utiliza dentro de archivos CoffeeScript así:

# 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: he comprobado en Rails 5.0 aplicación

Cuestiones relacionadas