如何使用Rails生成动态XML页面?

时间:2009-07-02 19:53:19

标签: ruby-on-rails xml ruby flex

我有一个输出XML字符串的函数:

<expensesAC>
  <cashflow>
    <month>6</month>
    <cash>300</cash>
    <projected>null</projected>
  </cashflow>
  <cashflow>
    <month>6</month>
    <cash>300</cash>
    <projected>null</projected>
  </cashflow>
  <cashflow>
    <month>6</month>
    <cash>300</cash>
    <projected>null</projected>
  </cashflow>
</expensesAC>

我有一个名为genxml.xml.erb的视图,并且重定向到mysite.com:3000/genxml.xml

我需要这个,因为flex需要传递XML文件。但是,我得到的是:

<body>
<expensesAC>
  <cashflow>
    <month>6</month>
    <cash>300</cash>
    <projected>null</projected>
  </cashflow>
</expensesAC>
  <cashflow>
    <month>6</month>
    <cash>300</cash>
    <projected>null</projected>
  </cashflow>
  <cashflow>
    <month>6</month>
    <cash>300</cash>
    <projected>null</projected>
  </cashflow>
</body>

因此,基本上,Rails强制我的XML字符串为HTML。

如何使用我的字符串生成动态XML页面?或者,如何将XML字符串转换为动态生成的XML页面?我不想创建静态文件,这些文件需要动态生成,因为XML集中的数据将是每个用户的私有信息。

3 个答案:

答案 0 :(得分:6)

如果要使用Rails编写XML文件,可能需要从ERB切换到Builder template handler

如果您正在使用ActiveRecord对象,则在指定渲染选项时也可以使用方便的:xml选项。

def index
  @records = Model.all
  respond_to do |format|
    format.html
    format.xml { render :xml => @records }
  end
end

答案 1 :(得分:2)

我目前正在做你想要的没有问题。 ERB生成XML当然是最方便的方法之一,特别是如果输出主要是XML模板。它还可以做一些巧妙的技巧,比如使用集合渲染部分。

但是我知道这不常用于工作(必须使用builders),但我可以看到至少从Rails 2.3.5起,ERB方法似乎工作正常。

e.g。

class MyController < ApplicationController
  def genxml
    respond_to do |format|
      format.xml 
    end
  end
end

然后genxml.xml.erb生成一个有效的XML文件,你甚至可以做一些技巧:

<expensesAC>
<%= render :partial => 'expenses/cashflow', :collection => @expenses-%>
</expensesAC>

其中费用/ _cashflow.xml.erb类似于:

<cashflow>
  <month><%= cashflow.month %></month>
  <cash><%= cashflow.cash %></cash>
  <projected><%= cashflow.projected %></projected>
</cashflow>

注意:交错的&lt; expenseAC&gt;和&lt; cashflow&gt;在您的示例中,可能表明您的XML生成逻辑中存在另一个问题。

答案 2 :(得分:1)

在控制器中,您需要将内容呈现为xml。类似的东西:

def show
  respond_to do |format|
    format.html
    format.xml { render :xml => my_function_that_outputs_xml }
  end
end