2010-12-22 8 views
7

Tengo un constructor que representa xml cuando se llama a create. ¿Cómo puedo omitir el paso de representación, pero guardar el xml en el sistema de archivos?¿Cómo guardar el xml generado por Ruby Builder en lugar de renderizarlo en la aplicación Rails?

def create 
    @server = Server.new(params[:server]) 

    respond_to do |format| 
     if @server.save 
      flash[:notice] = "Successfully created server." 
      format.xml 
     else 
      render :action => 'new' 
     end 
    end 
end 
+0

posible duplicado de [archivos XML de ahorro con rieles] (http://stackoverflow.com/questions/4163385/saving-xml-files-with-rails) –

Respuesta

26

El constructor XML puede escribir sus datos a cualquier objeto apoyar el operador <<. En su caso, los objetos String y File parecen ser los más interesantes.

Usando una cadena sería algo como esto:

xml = Builder::XmlMarkup.new # Uses the default string target 
# TODO: Add your tags 
xml_data = xml.target! # Returns the implictly created string target object 

file = File.new("my_xml_data_file.xml", "wb") 
file.write(xml_data) 
file.close 

Pero ya que la clase File soporta el operador << así, puede escribir los datos directamente en un archivo:

file = File.new("my_xml_data_file.xml", "wb") 
xml = Builder::XmlMarkup.new target: file 
# TODO: Add your tags 
file.close 

Para más detalles eche un vistazo a the documentation of XmlMarkup.

0

Esto es tan bueno. también puede crear una ruta para almacenar todos los xmls en una carpeta determinada para que la aplicación esté organizada.

file = File.new("some_path/my_xml_data_file.xml", "w") 

Gracias Daniel

+0

favor, ¿podría dime la razón de esto file = File.new ("xml/experiment.xml", "w") # creando el archivo de generador para el xml xml = Builder :: XmlMarkup.new: target => archivo # xml tags xml.instruct! xml.EXPERIMENT_SET { xml.alias ("# {@}") experiment.alias xml.center_name "#{@experiment.center_name}"} consigo una salida como esta ZAP430 Lo que no es un XML puro, todas las etiquetas se muestran en una sola línea. – A1aks

+0

Utilice 'xml = Builder :: XmlMarkup.new (: target => file,: indent => 2)' para obtener un bonito XML. Observe ': sangría => 2' al crear el constructor. – Kush

Cuestiones relacionadas