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.jsで関連するモデルのREADとCREATE

By: woodleywonderworks – CC BY 2.0   ThoughtBotの本を読み進めてるけど私には買ってよかったと感じている ゾンビviewのワナを回避す …

Rails3でajaxでD&Dでまとめてファイルアップロード2~jQueryFileUpload for Rails

  前提 Rails3でajaxでD&Dでまとめてファイルアップロード~jQueryFileUpload for Rails Ruby on Rails 3.2でファイルアップロード …

RailsでECサイト構築6 固定ページを作る~spree

  ECサイトを作成するときには日本の法律にしたがって色々と表示しなければならない 表示しなければならないことについては次のページが詳しかった 本サイトについて 実際のECサイトをみれば実例 …

Rails3.2でFacebook風インターフェイスでタグづけ〜acts-as-taggable-on+jquery.tokenInput

By: Mauquoy Token Company – CC BY 2.0 railscasts.com/episodes/258-token-fields?language=ja&#03

no image

Rails3.2でBackbone.jsとPrivate_pubでToDoアプリをリアルタイム化(できた!)

参考 Rails3.2でリアルタイムメッセージング~Private_pub、Faye Rails3.2とBackbone.jsでToDoアプリを作ってみた~backbone-on-rails &nbs …