2010-02-01 23 views
7

Comencé a usar las plantillas xml builder para la mayoría de mi modelo. Necesito encontrar una forma genérica para construir XML fuera de un render que use la plantilla .xml.builder en lugar del método genérico .to_xml provisto en el modelo¿Cómo puedo generar XML desde XMLBuilder usando un archivo .xml.builder?

Supongo que tendré que anular el to_xml predeterminado (o agregue un to_my_xml), pero no puedo ver cómo hacer que XMLBuilder use mis archivos .builder.

¿Alguna idea?

Respuesta

3

Añadir un bloque respond_to en su controlador para que la plantilla adecuada se hace de acuerdo con el formato solicitado. Por ejemplo:

def show 
    ... 
    respond_to do |format| 
    format.html # renders show.html.erb 
    format.xml # renders show.xml.builder 
    end 
end 
+1

Gracias por la respuesta rápida. Ya tengo un bloque de respuesta, pero necesito saber el XML que generará el bloque responder_ antes de que se ejecute ya que necesito pasar este XML como un mensaje XMPP. El renderizado en el bloque responder_a utiliza una plantilla .xml.builder que intento imitar. – Barrie

1

Si usted está buscando la manera de crear XML usando constructor entonces esta es la forma en que puede hacerlo

require 'rubygems' 
require 'builder' 
builder = Builder::XmlMarkup.new(:indent=>2) 
builder.instruct! :xml, :version=>"1.0", :encoding=>"UTF-8" 
builder.my_elements do |e| 
    builder.myitem {|element| element.my_element_name('element_value')} 
end 

#=> 

<?xml version="1.0" encoding="UTF-8"?> 
<my_elements> 
    <myitem> 
    <my_element_name>element_value</my_element_name> 
    </myitem> 
</my_elements> 
+0

Hola Naz, gracias por eso. La clave es que quiero usar el mismo archivo de plantilla que el render usa para generar el XML. Por lo tanto, mi bloque respond_to se parece a esto: respond_to hacer | formato | format.html format.xml {render: template => "diapositivas/slides_and_comments.xml.builder"} final ¿Cómo llego XmlBuilder utilizar la plantilla "diapositivas/slides_and_comments.xml.builder"? – Barrie

1

Hola yo sólo tenía que resolver este problema. Aquí es cómo lo hice funcionar, comentarios en línea ...

class PostsController < ApplicationController 
    # this must be included to use tag helpers like cdata_block, etc ... 
    include :Helpers::TagHelper 

    def preview_xml 
    @post = Post.find(params[:id]) 

    # You must set up a instance variable named 'xml' 
    xml = ::Builder::XmlMarkup.new(indent: 2) 

    builder_file = File.read(::Rails.root.to_s + '/app/views/posts/show.xml.builder') 

    require 'builder' 

    # instance_eval evaluates the file within the context of the current instance -- so the 
    # xml variable we just set will be accessable within the builder_file 
    instance_eval builder_file 

    @tag_xml = xml.target! 
    end 

end 
+0

es posible que desee poner la 'require' por encima del :: generador constante – Tails

Cuestiones relacionadas