¿Cómo puedo pasar un objeto a las vistas de rabl desde la tarea de rake?
Frecuentes
Visto 2,321 veces
2
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
1 Respuestas
11
Me encontré con un problema similar. Básicamente tienes 2 opciones:
- Pasar un solo objeto explícitamente como un parámetro
- 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
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas ruby-on-rails-3 json rabl or haz tu propia pregunta.
Usamos una técnica diferente, pero esta funciona muy bien... ¡gracias! - aarón tomas