4

私は何をしたいですか?

Rails 3.2でテンプレートファイルから.docxファイルや.odtファイルを生成し
たいのですが、日本語を使いたいです。
ubuntu サーバー 12.04 & ruby​​ 1.9.3p194 & rails 3.2.8

どうしたの?

gem「docx-templater」と「serenity」を試してみた

ruby-docx-templater

https://github.com/jawspeak/ruby-docx-templater

1 つのサンプルはうまく機能
します 2 私の Rails アプリで同じことを試してみてください

サンプルのようにコントローラーで

def gen_docx
  input_file = './app/template/ExampleTemplate.docx'
  data = {
    :teacher => "Priya Vora",
    :building => "Building #14",
    :classroom => :'Rm 202',
    :district => "Washington County Public Schools",
    :senority => 12.25,
    :roster => [
      {:name => 'Sally', :age => 12, :attendence => '100%'},
      {:name => :Xiao, :age => 10, :attendence => '94%'},
      {:name => 'Bryan', :age => 13, :attendence => '100%'},
      {:name => 'Larry', :age => 11, :attendence => '90%'},
      {:name => 'Kumar', :age => 12, :attendence => '76%'},
      {:name => 'Amber', :age => 11, :attendence => '100%'},
      {:name => 'Isaiah', :age => 12, :attendence => '89%'},
      {:name => 'Omar', :age => 12, :attendence => '99%'},
      {:name => 'Xi', :age => 11, :attendence => '20%'},
      {:name => 'Noushin', :age => 12, :attendence => '100%'}
    ],
      :event_reports => [
        {:name => 'Science Museum Field Trip', :notes => 'PTA sponsored event. Spoke to Astronaut with HAM radio.'},
        {:name => 'Wilderness Center Retreat', :notes => '2 days hiking for charity:water fundraiser, $10,200 raised.'}
    ],
      :created_at => "11-12-03 02:01"
  }
  DocxTemplater::DocxCreator.new(input_file, data).generate_docx_file()
end

3 しかし、エラーにより
、gem の次の時点で発生したエラーが発生しました (docx_templater.rb 22)

File.open(file_name, 'w') { |f| f.write(buffer) }

静けさ

https://github.com/kremso/serenity

1 サンプルはうまく動作します
2 私の Rails アプリで同じことを行い、
このようにうまく動作します

#encoding: utf-8
require 'serenity'
class Showcase
  include Serenity::Generator

  Person = Struct.new(:name, :items)
  Item = Struct.new(:name, :usage)

  def generate_showcase
    @title = 'Serenity inventory'

    mals_items = [Item.new('Moses Brothers Self-Defense Engine Frontier Model B', 'Lock and load')]
    mal = Person.new('Malcolm Reynolds', mals_items)

    jaynes_items = [Item.new('Vera', 'Callahan full-bore auto-lock with a customized trigger, double cartridge and thorough gauge'),
                Item.new('Lux', 'Ratatata'),
                Item.new('Knife', 'Cut-throat')]
    jayne = Person.new('Jayne Cobb', jaynes_items)

    @crew = [mal, jayne]

    render_odt 'app/template/showcase.odt'
  end
end

3 日本語を含むテンプレートを試しましたが、エラーが発生しました。
gem(template.rb 22) の次の時点で発生するエラー

    def process context
  tmpfiles = []
  Zip::ZipFile.open(@template) do |zipfile|
    %w(content.xml styles.xml).each do |xml_file|
      content = zipfile.read(xml_file)
      odteruby = OdtEruby.new(XmlReader.new(content))
      out = odteruby.evaluate(context)

      tmpfiles << (file = Tempfile.new("serenity"))
      file << out    #!!!! HERE !!!!
      file.close

      zipfile.replace(xml_file, file.path)
    end
  end
end

私がしたこと?

  • 'serenity' は gem にギリシャ語 (UTF-8) の rspec テストがあることを発見しました。同じ方法で日本語を試してみました。そしてテストは合格しました!だから、問題はレール設定の宝石ではないと思いました。

  • コントローラーまたは lib ファイルにマジック コメント「#encoding: utf-8」を追加します。

  • config/application.rb で「config.encoding = "utf-8"」を確認します
  • 「initialize!」の上の config/enviroment.rb に以下を追加します。

    Encoding.default_external = Encoding::UTF_8
    Encoding.default_internal = Encoding::UTF_8

  • 私のレールアプリではデータベースを使用していません。

しかし、すべては私のケースとは何の関係もありません... 何か考えはありますか? 基本的なことを知らないかもしれません...

4

1 に答える 1

4

これは少し古いですが、私はちょうどこれと同じ状況に遭遇しました。私の場合、書き込む前に一時ファイルをバイナリモードに設定する必要がありました。

  tmpfiles << (file = Tempfile.new("serenity"))
  file.binmode
  file << out   
  file.close

お役に立てれば

于 2013-03-12T17:01:22.700 に答える