Railsで使えるGem RubyOnRailsで帳票印刷

今度こそRails3.2からdocxを生成する

投稿日:2012年11月2日 更新日:

前提

Rubyからdocxを生成する

前回、イキオイアマって自分でdocxを生成する簡単なライブラリを作ってしまった.(なんて車輪の再発明

今回はこれをRailsから利用してみる.

構想

  • テンプレートファイルをアップロードして、そこから変数リストを作成.
  • 変数リストから動的にフォームを作成して、その変数に代入してdocxファイルを生成する

Railsのスキームは次のような感じで

アップロードしてみないと文書のスキームが不明なので細かいデータベース設計は放棄

データベースは検索とかそういうことは考えずにデータを保存しておくだけ

それならmongodbとかでもいいんだけど、ローカル利用を想定してるのにそのためだけにmongodbとかセットアップするのは大変だから、まずはsqliteでも動くようにした

各々のモデルに関連性を追記

アップロード

carrierwaveを使う

参考

Ruby on Rails 3.2でファイルアップロード〜CarrierWave & RMagick

generate

 file_uploader.rb

一応docxしかアップロードできないように指定

 

Model

template.rb

 view

_form.html.erb

テキストフィールドからファイルフィールドに変更

スキームの保存

このままではスキーム(templateのschemeカラムのこと)が保存されないから自作ライブラリを使ってschemeを自動で保存する

まずlib/mydocx/mydocx.rbにクラスを保存

念のためapplication.rbでlib/mydocx/以下をautoload対象にしておく

 

model

これで@@に囲まれた変数リストを自動でschemeに保存してくれる

docxの生成

Model

今度はDocumentモデルの方に生成用のメソッドをつくる

自作クラスのgenerateメソッドはdocxファイルを生成すると同時に生成したdocxファイルへのパスを返すようにしている

controller

で例えばコントローラーのshowメソッドあたりでsend_fileすればOK

できた!日本語も通る!

 

レイアウトと画面遷移を考える

  • テンプレート作成
  • テンプレートを選択してドキュメント作成

とりあえずこれだけ考える

やり方としては

  1. templateのshowで関連するdocumentのindexを表示する
  2. templateのshowに関連するdocumentのフォームを設置する
  3. 画面遷移を適当に直す

で、いけるはず

templateのshowで関連するdocumentのindexを表示する

documents/index.html.erbからコピーしてきて、@documentsを@template.documentsにすればOK

 

templateのshowに関連するdocumentのフォームを設置する

同じくdocuments/_form.html.erbからコピーして、template_idはhidden_fieldにでもしておけばOK

新規作成用の@documentインスタンスをtemplates/showメソッドに用意しておく

あと、documents/createのメソッドでもdataを取れるようにしておく

 

画面遷移を適当に直す

documentをcreate後にtemplateのshowに戻すように、templates/createメソッドの遷移先を訂正

できた

こんなテンプレートをアップロードすると

テンプレートを認識してフォームを作ってくれる

 

データを登録して

showをクリックすると

入力したデータに応じて、代入したdocxをダウンロードできます

データの更新

このままだとdocumentデータのeditフォームがうまく機能しない.

text_field_tagを使ってるから入力してあげないといけない

documents_controllerで@dataとかでハッシュをつくって

フォームで@dataを読み込んでやれば

できた

updateの行き先もtemplateのshowにしておくと都合がいい

データの削除

documentの削除の行き先もtemplateのshowにしておく

ついでに、 テンプレートを削除したら関連するドキュメントも削除するように設定

 

-Railsで使えるGem, RubyOnRailsで帳票印刷
-, ,

執筆者:

関連記事

Rubyでウェブサイトを操作してリストをつくる〜mechanize

    By: JoshSemans   以前からRailscastsというRuby on Railsの動画サイトが好きでよく見ているのだが、380近く動画があって気にな …

FullCalendarのagendaViewでselectの場所がずれる問題

  By: Ben Piddington 前回 Rails3.2でGoogle Calendarライクなカレンダーを使う〜fullcalendar-rails   gemは最新の1 …

Rails5でマテリアルデザイン~material_design_lite-sass

By: AnnaKika – CC BY 2.0 目次1 マテリアルデザイン2 gem3 scss & javascript4 Turbolinksに対応5 simple_form …

simple_formからdatepickerを使うには~ui_datepicker-rails3

  github.com/kristianmandrup/ui_datepicker-rails3 目次1 Gemfile2 js3 css4 initializer5  使う6 できた G …

Rails3.2でみたまま編集 〜hallo editor

  By: Fabio Marini – CC BY 2.0 文字をダブルクリックしてそのままフォーム編集するやつのメモ~in place edit 文字をダブルクリックしてその …