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

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

投稿日:

 

前提

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で帳票印刷
-, ,

執筆者:

関連記事

backbone-railsのscaffoldで生成されるコードでルーティングとCRUDの処理をどうやってるのか読んでみた

By: asobi tsuchiya   目次1 はじめに2 サンプルの準備3 初期化4 ルーター5 READ6 CREATE7 UPDATE8 DELETE はじめに backbone-r …

全文検索エンジンGroongaをRubyから利用するライブラリのチュートリアルをやってみた〜rroonga

By: Kevin Jarrett – CC BY 2.0 目次1 Groonga2 Groongaのインストール3 rroongaのインストール4 チュートリアルの開始5 データベースの …

no image

Rubyでffmpegのラッパーを使う~streamio-ffmpeg

  github.com/streamio/streamio-ffmpeg rubyでffmpegが扱える高機能ラッパー 導入 [crayon-58fc9708b800e862179544/ …

no image

Rails3.2でajaxなフォルダツリーを導入する4~dynatree-rails & Drag’n’Drop

wwwendt.de/tech/dynatree/doc/dynatree-doc.html wwwendt.de/tech/dynatree/doc/samples.html 今日はドラッグアンドド …

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

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