Ruby on rails 在rails中生成XML

Ruby on rails 在rails中生成XML,ruby-on-rails,xml,Ruby On Rails,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方法

我创建了一个具有操作的控制器:

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.
一些头衔
一些头衔
一些头衔
...
其中只有1个Owner元素和多个Book元素

我只能输出书籍元素,但不能输出同一级别书籍中的一个所有者。请帮忙

不是解决方案,而是黑客

@books.to_xml(...).sub("<Books>","<Books><Owner>1</Owner>")
@books.to_xml(…).sub(“,“1”)
不是解决方案,而是黑客

@books.to_xml(...).sub("<Books>","<Books><Owner>1</Owner>")
@books.to_xml(…).sub(“,“1”)

您应该使用Rails XML Builder构建它,但要注意命名约定。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\u id
@books
。然后在
视图/controller\u name/gen\u books\u 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.instruction!#排队
xml.books do#xml.foo创建foo元素
xml.owner@owner_id#您在一个块中,因此xml.bar将创建元素
@每一本书|
xml.book-do
xml.title book.title
终止
终止
终止

您可以修改此生成器,使XML看起来像您喜欢的样子。

您应该使用Rails XML builder构建它,但要注意命名约定。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\u id
@books
。然后在
视图/controller\u name/gen\u books\u 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.instruction!#排队
xml.books do#xml.foo创建foo元素
xml.owner@owner_id#您在一个块中,因此xml.bar将创建元素
@每一本书|
xml.book-do
xml.title book.title
终止
终止
终止

您可以修改此生成器,使XML看起来像您喜欢的样子。

感谢您的快速响应!似乎它生成了正确的文档,但也生成了以下错误消息:此页面包含以下错误消息:第1列第3行错误:下面文档末尾的额外内容是第一个错误之前的页面呈现。哦,抱歉!我有问题。我用1代替了1。这个问题已经解决了,虽然它是一个黑客,谢谢!您可以发布生成的整个XML文档吗?stackoverflow新手,不知道现在选中的复选标记,感谢您快速响应!似乎它生成了正确的文档,但也生成了以下错误消息:此页面包含以下错误消息:第1列第3行错误:下面文档末尾的额外内容是第一个错误之前的页面呈现。哦,抱歉!我有问题。我用1代替了1。这个问题已经解决了,虽然它是一个黑客,谢谢!您可以发布生成的整个XML文档吗?stackoverflow新手,不知道现在选中的复选标记,谢谢