¿Cuál es la mejor manera de guardar lo generado por una vista en un
archivo en disco?
Tengo una ruta tipo “miapp.com/trabajos/list”, que genera un XML con
todos los trabajos. Me vendría bien guardarla como un archivo XML, en
disco.
La manera inmediata de hacerlo es generar el archivo desde el
controlador, pero por ser más DRY y ya que tengo la vista, ¿se puede
coger lo generado por una vista en una variable, y reutilizar eso en
otro lado? Algo así como:
@chorizo = “lo que escupa /trabajos/list”
File.open(“archivo.xml”, “w”) do |f|
local_file.write(@chorizo)
end
O sea:
def publica
# Guarda todos los trabajos en un fichero XML
@chorizo = “lo que escupa /trabajos/list”
File.open(“#{RAILS_ROOT}/public/archivo.xml”, “w”) do |f|
f.write(@chorizo)
end
end
Pero en @chorizo, lo que renderice la vista /trabajos/list.
Jaime
2007/8/22, Jaime I. [email protected]:
2007/8/22, javier ramirez [email protected]:
puedes usar render_to_string o render_component_as_string
Muchas gracias Javier, me ha funcionado con
render_component_as_string, mientras que no con render_to_string. Aquí
va el código:
def publicar
# Guarda todos los trabajos en un fichero XML
@chorizo = render_component_as_string(:controller => ‘xml/trabajos’)
File.open(“#{RAILS_ROOT}/public/archivo.xml”, “w”) do |f|
f.write(@chorizo)
end
flash[:notice] = ‘Se han exportado todos los trabajos al archivo
XML.’
redirect_to :action => :list
end
Hola Jaime,
La manera inmediata de hacerlo es generar el archivo desde el
controlador, pero por ser más DRY y ya que tengo la vista, ¿se puede
coger lo generado por una vista en una variable, y reutilizar eso en
otro lado? Algo así como:
puedes usar render_to_string o render_component_as_string
el primero es más eficiente, porque solamente ejecuta el código de la
lista y lo devuelve en una cadena sin nada más, es como cuando haces un
render :action desde un controller sólo que en lugar de tirarlo a la
salida lo pone en una string
si tu vista es compleja y tiene una acción propia que carga datos o
realiza cualquier proceso y no puedes sacar esa lógica a otro método,
puedes usar render_componen_as_string, que ejecuta una acción completa,
la parte del controlador y la de la vista, y te la devuelve en una
cadena. El problema es que para conseguir eso se requieren crear varios
objetos en memoria y es más costoso.
cualquiera de los dos render anteriores no cuentan como render “de
verdad” y no te darán el error de doble render habitual que te pasa en
un controller si usas render dos veces.
saludos,
javier ramírez
On Aug 22, 2007, at 12:59 PM, javier ramirez wrote:
cualquiera de los dos render anteriores no cuentan como render “de
verdad” y no te darán el error de doble render habitual que te pasa en
un controller si usas render dos veces.
No se cual es la razon, quiza es simplemente consecuencia de la
implementacion (la segui hace un tiempo y hay un flag por ahi
bailando) o quiza por diseño (no se me ocurre una justificacion en
tal caso), pero si haces primero un render :action y despues un
render_to_string da un DoubleRenderError. En cambio si se invierte el
orden en efecto no hay error. El Agile dice tambien que
render_to_string no cuenta para el double render (pag 431), pero no
parece ser exacto en ese punto.
– fxn