Ruby on rails RubyonRails XML生成

Ruby on rails RubyonRails XML生成,ruby-on-rails,xml,ruby,file-io,Ruby On Rails,Xml,Ruby,File Io,我试图构建一个简单的方法,从RubyonRails中的数据库创建一个XML文件。我觉得我的代码是正确的,但我没有看到XML中的所有用户。 我对RoR完全是个新手 这是我的密码: def create_file @users = User.find(:all) file = File.new('dir.xml','w') doc = Document.new make = Element.new "make" @users.each do |y| make.

我试图构建一个简单的方法,从RubyonRails中的数据库创建一个XML文件。我觉得我的代码是正确的,但我没有看到XML中的所有用户。 我对RoR完全是个新手

这是我的密码:

def create_file     
  @users = User.find(:all)
  file = File.new('dir.xml','w')
  doc = Document.new

  make = Element.new "make"
  @users.each do |y|
    make.add_element "name"
    make.elements["name"].text  = y.name
    make.add_element "description"
    make.elements["description"].text = y.description
  end    

  doc.add_element make

  file.puts doc
  file.close
end
和我的XML输出:

<make>
 <name>sammy</name><description>samsdescription</description>
 <name/><description/>
 <name/><description/>
 <name/><description/>
 <name/><description/>
 <name/><description/>
 <name/><description/>
 <name/><description/>
 <name/><description/>
 <name/><description/>
 <name/><description/>
 <name/><description/>
 <name/><description/>
</make>

我不明白为什么没有填充所有字段。为什么只有一个数据库实体出现?非常感谢您的帮助。

您的代码中有一个bug。在每次迭代中,您使用创建一个元素,然后尝试使用访问该元素。但是当您在Elements[]中使用节点名时,它只返回第一个匹配的节点。因此,您在每个迭代中创建一个节点,但只更新第一个节点。尝试将代码更改为以下内容:

@users.each do |y|
  name_node = make.add_element "name"
  name_node.text  = y.name
  desc_node = make.add_element "description"
  desc_node.text = y.description
end

顺便说一下,您的XML结构有点奇怪。如果您将每个名称/描述对都包装到另一个节点(比如user)中,然后又有许多用户节点,这不是更清楚吗?

您的代码中有一个bug。在每次迭代中,您使用创建一个元素,然后尝试使用访问该元素。但是当您在Elements[]中使用节点名时,它只返回第一个匹配的节点。因此,您在每个迭代中创建一个节点,但只更新第一个节点。尝试将代码更改为以下内容:

@users.each do |y|
  name_node = make.add_element "name"
  name_node.text  = y.name
  desc_node = make.add_element "description"
  desc_node.text = y.description
end

顺便说一下,您的XML结构有点奇怪。如果您将每个名称/描述对包装在另一个节点(例如,user)中,然后有许多用户节点,这不是更清楚吗?

您应该调查@users.to_xml,看看是否可以使用它,而不是滚动您自己的解决方案。请在中阅读更多关于它的信息。

您应该调查@users.to_xml,看看它是否是您可以使用的东西,而不是滚动您自己的解决方案。阅读更多关于它的信息。

是的,现在这个没有多大用处,我只是想尝试学习一下。谢谢你的回答!是的,现在这个没有多大用处,我只是在玩,试着去学。谢谢你的回答!