En estos dÃas he tenido que crear un fichero a partir de unos formularios, guardarlos y dar la opción de descargarlo.
Pongo la chuleta por aquÃ, porque luego se me olvida O:-)
En el controller creo el método siguiente para crear el fichero
def generate_afile
@project =Project.find(params[:id])
@language = Language.find(params[:lang])
#Composing the file name
@afile=@project.name+ "-" + @language.language+".txt"
#Creating the query for extraction just the info needed
@translations = Translation.find(:all, :conditions => {:project_id => @project.id, :language_id => @language.id})
#Writing the file
temp_file = File.new(“#{RAILS_ROOT}/tmp/”+@afile, “w”)
File.open(“#{RAILS_ROOT}/tmp/”+@afile, “w”) do |file|
for t in @translations
pofile= ‘msgid “‘+t.message.name + ‘”‘ + “\n”+’msgstr “‘+t.translation+'”‘+”\n”
file.write(pofile)
end
end
end
Y a continuación del anterior, creo el método para descargar el fichero, y que será al que llame desde la vista
def download_file
generate_pofile
send_file "#{RAILS_ROOT}/tmp/"+ @pofile, :filename => @pofile
end
En la vista pongo lo siguiente
<h3><%=Â link_to "Download file", {:action => 'download_file', :id => @project.id, :lang => @language.id}Â %></h3>
Pues esto es todo y asà se lo hemos contado
Pues mola. Casi que lo podÃas hacer directamente todo en un sólo método, no?
Otra idea serÃa dejarlo en 2 métodos pero desde download_file llamar a generate_file sólo en caso de que no exista el fichero: asà puedes tener algo de cache, es decir, sólo generas el fichero la primera vez y en las sucesivas llamadas te basta con devolverlo. Creo que puedes comprobar con FileTest.exists?(nom_fichero)… más info aquÃ:
http://paulsturgess.co.uk/articles/show/36-how-to-check-if-a-file-exists-in-ruby-on-rails
Claro que si cambian los contenidos de la base de datos puede ser necesario regenerar el fichero… esto lo puedes hacer con un Sweeper que vigile los modelos y en caso de modificaciones, borre los ficheros correspondientes.
En principio genero cada vez el fichero porque cambia con mucha frecuencia. Miraré el Sweeper para ver si puedo hacer un control de ficheros.