¿Cómo puedo pasar un objeto a las vistas de rabl desde la tarea de rake?

Estoy tratando de crear un archivo json a partir de una tarea de rake usando rabl. A continuación tengo la versión simplificada para probar.

Cuando veo 'articles.json' o 'articles/2.json' a través de la URL, obtengo la respuesta json esperada.

Pero cuando trato de ejecutarlo a través de la tarea de rake, siempre tiene un valor nulo para @articles en el jsonFile creado. Representará la vista index.json.rabl la misma cantidad de veces que @articles.count, pero los valores siempre son nulos.

Entonces, ¿cómo paso el objeto @articles creado en mi tarea de rake a Rabl.render?

index.json.rabl

@feedName ||= 'default'
node(:rss) { partial('articles/rss), :object => @feedName }
node(:headlines) { partial('articles/show'), :object => @articles }

mostrar.json.rabl

object @article
attributes :id,:body
....

exportaciones.rake

task :breakingnews => :config do
  filename = 'breakingnews.json'
  jsonFile = File.new(filename)
  @articles = Article.limit(10)
  n = Rabl::renderer.json(@articles,'articles/index',view_paths => 'app/views')
  jsonFile.puts b
  jsonFile.close

preguntado el 22 de mayo de 12 a las 19:05

1 Respuestas

Me encontré con un problema similar. Básicamente tienes 2 opciones:

  1. Pasar un solo objeto explícitamente como un parámetro
  2. Pasar varios objetos implícitamente por alcance

Por parámetro

en tu tarea

@your_object = ...
Rabl.render(@your_object, 'your_template', view_paths => 'relative/path/from/project/root', :format => :json)

En tu Plantilla Rabl

object @any_name_you_like
attributes :id,:body
....

Esto representará su plantilla como un json con el objeto especificado como su objeto de instancia (puede nombrarlo como desee)

Por alcance

Esto es un poco más complicado. La única opción que encontré es establecer los objetos deseados como variables de instancia en el alcance de la llamada y configurar este alcance para la representación de la plantilla (ver alcance).

en tu tarea

@one_object = ...
@another_object = ...
Rabl.render(nil, 'your_template', view_paths => 'relative/path/from/project/root', :format => :json, :scope => self)

En tu Plantilla Rabl

object @one_object
attributes :id,:body
node(:my_custom_node) { |m| @another_object.important_stuff }

Respondido el 13 de junio de 12 a las 19:06

Usamos una técnica diferente, pero esta funciona muy bien... ¡gracias! - aarón tomas

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.