在rails中生成XML

Pet*_*ong 1 xml ruby-on-rails

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

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
Run Code Online (Sandbox Code Playgroud)

如何在Book模型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>
Run Code Online (Sandbox Code Playgroud)

其中只有1个Owner元素和许多Book元素

我只能输出Book元素,但不能在同一级别的Books中输出一个Owner.请帮忙!!!

Cem*_*kas 6

您应该使用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
Run Code Online (Sandbox Code Playgroud)

现在,您可以@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
Run Code Online (Sandbox Code Playgroud)

您可以修改此构建器以使XML看起来像您喜欢的那样.