2010-06-09 77 views
1

我创建了一个有作用的控制器:生成XML

def gen_books_xml 
    @books = Book.find(:all, :conditions => {:owner_id => 1}) 
    respond_to do |format| 
    format.xml { render :xml => @books.to_xml(:root => "Books", :skip_types=>true) } 
    end 
end 

我怎么能实现它可以生成以下格式的图书模式SA的to_xml方法?

<?xml version="1.0" encoding="UTF-8"?> 
<Books> 
    <Owner>1</Owner> 
    <Book><title>some title</title></Book> 
    <Book><title>some title</title></Book> 
    <Book><title>some title</title></Book> 
    ... 
</Books> 

仅存在1业主元件和许多Book元素

我只能输出书元素,但不能输出一个所有者在书籍的相同的水平。请帮忙!!!

回答

6

你应该使用Rails XML构建器构建它,但要小心的命名约定。 PS,这些例子没有经过测试,可能会有一些错误,根据您自己的判断使用。更改您的控制器像这样:

def gen_books_xml 
    @owner_id = 1 
    @books = Book.find(:all, :conditions => {:owner_id => @owner_id}) 
    respond_to do |format| 
    format.xml 
    end 
end 

现在,你有@owner_id@books访问从你的观点。然后在views/controller_name/gen_books_xml.xml.builder创建构建器文件:

xml.instruct!    # for the <?xml version="1.0" encoding="UTF-8"?> line 
xml.books do    # xml.foo creates foo element 
    xml.owner @owner_id  # you're inside a block so xml.bar will create <foo><bar/></foo> elements 
    @books.each do |book| 
    xml.book do 
     xml.title book.title 
    end 
    end 
end 

您可以修改此建设者,使但是你喜欢的XML看看。

0

没有解决办法,但黑客

@books.to_xml(...).sub("<Books>","<Books><Owner>1</Owner>") 
+0

谢谢你的回复如此之快!它似乎生成了正确的文档,但也出现以下错误消息:此页面包含以下错误消息:第1行第3行上的错误:文档结尾处的额外内容下面是页面渲染到第一个错误。 – PeterWong 2010-06-09 07:36:36

+0

对不起!我有这个问题。我使用而不是 。问题已经解决,虽然是黑客,谢谢! – PeterWong 2010-06-09 07:50:03

+0

你可以发布生成的整个XML文档吗? – 2010-06-09 07:50:32