2010-02-01 24 views
7

Tôi đã bắt đầu sử dụng các mẫu trình xây dựng xml cho hầu hết các mô hình của tôi. Tôi cần phải tìm một cách chung chung để xây dựng XML bên ngoài kết xuất sử dụng mẫu .xml.builder thay vì phương thức .to_xml chung được cung cấp trong mô hìnhLàm cách nào để tạo XML từ XMLBuilder bằng tệp .xml.builder?

Tôi thu thập rằng tôi sẽ phải ghi đè lên mặc định to_xml (hoặc thêm một to_my_xml), nhưng tôi không thể xem cách để XMLBuilder sử dụng các tệp .builder của tôi.

Bất kỳ ý tưởng nào?

Trả lời

3

Thêm khối respond_to vào bộ điều khiển của bạn sao cho mẫu thích hợp được hiển thị theo định dạng được yêu cầu. Ví dụ:

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

Cảm ơn phản hồi nhanh. Tôi đã có một khối phản hồi, nhưng cần biết XML sẽ được tạo ra bởi khối response_to trước khi nó chạy khi tôi cần truyền XML này như một thông báo XMPP. Kết xuất trong khối respond_to sử dụng mẫu .xml.builder mà tôi đang cố gắng bắt chước. – Barrie

1

Nếu bạn đang tìm kiếm cách tạo xml sử dụng xây dựng thì đây là cách bạn có thể làm điều đó

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

Hi Naz - cảm ơn vì điều đó. Điều quan trọng là mặc dù tôi muốn sử dụng cùng một tệp mẫu mà kết xuất sử dụng để tạo XML. Vì vậy, khối phản hồi của tôi sẽ giống như sau: respond_to do | format | format.html format.xml {render: template => "slides/slides_and_comments.xml.builder"} kết thúc Làm cách nào để XmlBuilder sử dụng mẫu "slides/slides_and_comments.xml.builder"? – Barrie

1

Hi Tôi chỉ phải giải quyết vấn đề này. Đây là cách tôi làm cho nó hoạt động, nhận xét nội tuyến ...

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

bạn có thể muốn đặt 'require' phía trên hằng số :: builder – Tails

Các vấn đề liên quan