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

執筆者:

関連記事

no image

Railsで動画を管理する2 動画のサムネイルを作成する~CarrierWave + Flowplayer

  *とりあえず動いているけど、もっとましな方法があるとおもいます 前提 Railsで動画ファイルを管理する~CarrierWave Flowplayer 参考 Rubyでffmpegのラッ …

no image

Rails3.2のアプリにユーザー機能を追加する~Devise

  アプリにユーザー機能を追加するためにdeviseというgemを使った deviseを使えば高機能なユーザー管理機能を簡単につけることができる 参考 Rails3.2+Mongoidでログ …

Rails4.2で簡単にマテリアルデザインを使えるmatelializeを試してみた〜matelialize

By: Basheer Tome – CC BY 2.0 目次1 マテリアルデザイン2 matelialize3 Gemfile4 application.scss5 applicatio …

no image

Rubyからdocxを生成する

    前提 Rubyでdocxをいろいろ分析してみた 変数の仕様~正規表現 いろいろなパターンで試してみた 例えば、こんな文 [crayon-59c138301a3bf03806 …

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

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