在Rails中使用Builder Gem导出XML文件

时间:2015-05-28 15:34:41

标签: ruby-on-rails ruby

我有这门课。我在这里使用builder gem。

class ClientsExportXML

  def initialize(current_user)
    @file = File.new("#{Rails.root}/public/data.xml", 'w')
    @clients = Repository::Clients.new(current_user).all
    @builder = Builder::XmlMarkup.new(:target=> @file, :indent=> 2)
  end

  def build
    @builder.instruct! :xml, :version=>"1.0", :encoding=>"UTF-8", :company => "Tougg"
    @builder.clients do
      @clients.each do |c|
        @builder.client do
          @builder.name(c.name)
          @builder.razao_social(c.corporate_name)
          @builder.rg(c.rg)
          @builder.cpf(c.cpf)
          @builder.inscricao_estadual(c.state_registration)
          @builder.cnpj(c.cnpj)
          @builder.email(c.email)

          if c.address
            @builder.numero_rua(c.address.street_name)
            @builder.bairro(c.address.district)
            @builder.complement(c.address.complement)
            @builder.cep(c.address.zipcode)
            @builder.cidade_estado("#{City.find(c.address.city_id).name}/#{City.find(c.address.city_id).state.symbol}")
          end

          @builder.telefones do
            c.phones.each do |f|
              @builder.numero(f.number)
            end
          end

          @builder.notas do
            c.notes.each do |n|
              @builder.nota do
                @builder.nota(n.note)
                @builder.adicionada_em(n.created_at.strftime("%d/%m/%y"))
              end
            end
          end
        end
      end
    end
    @file.close
  end
end

例如,当我在rails控制台中执行此操作时,一切正常。但是,我不知道为什么,当我尝试在某个控制器中添加它时:

  def export
    ....
     ClientsExportXML.new(current_user).build
    ...
  end

该文件在public / data.xml创建,但没有内容(空文件)。

我对这里可能发生的事情感到有些困惑。

提前致谢

Édipo

解决

我将文件更改为实例变量,并在方法构建结束时关闭文件。我更新了代码以反映这一点。

1 个答案:

答案 0 :(得分:0)

尝试在@builder.target!方法的最后一行添加buildtarget!方法从构建器生成XML。

编辑:

def export
  ..
  File.open(file_path, "w") do |f|
    f.write(ClientsExportXML.new(current_user).build)
  end
  ..
end

你的export方法看起来像这样吗?