Render_to_string en tarea rake


Ror-es mailing list
[email protected]

Hola,

Hola a todos, alguien sabe como hacer un render_to_string desde una
tarea rake ??, he probado de todo, haciendo un
ActionController::Base.new.render_to_string falla con el siguiente msg:
The error occurred while evaluating nil.body=
/srv/vlex-ng-geronimo/vendor/rails/actionpack/lib/action_controller/base.rb:914:in
`erase_render_results’

bueno… como no estás en una petición normal al controlador no hay una
instancia de controller a la que pedirle el render.

Una solución recomendable sería tratar de refactorizar tu código y ver
si puedes obtener la misma salida de otra forma.

En caso de que no puedas, la opción más simple puede ser usar la
librería open-uri para hacerte una petición interna desde tu tarea rake
a tu propia aplicación de forma que se conecte por http y te devuelva el
resultado. Eso es sencillo de montar y te funciona seguro.

Si ninguna de las otras opciones te convence, se puede cacharrear un
poco y siempre puedes intentar recurrir a los objetos de Integration que
trae Rails. Por ejemplo habrás visto que desde la consola puedes hacer

app.get(’/controller/action’)

y luego

app.html_document.root.to_s

con eso puedes invocar una acción determinada y luego obtener el html
desde la consola.

Eso funciona porque en la consola hay un objeto built-in justo para eso.
Puedes ver el código que usa rails en /railties/lib/console_app

De hecho podrías hacer que tu rake haga un require de ese fichero con lo
que tendrías el objeto app disponible para ti desde tus tareas y ya
puedes. Si optas por esta opción, el require lo tienes que hacer dentro
de tu tarea, y no al principio del fichero rake. Esto es así porque el
script console_app depende de que previamente se haya cargado el entorno
de rails, así que tienes que crearte la rake con una dependencia de
environment y luego hacer el require dentro tal que así

task :test_users => :environment do
require ‘console_app’
app.get(’/users’)
puts app.html_document.root.to_s
end

suerte,

javier ramírez