hiddy0329
@hiddy0329 (hiddy)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

thinreportsのリスト機能の使い方が分かりません。

解決したいこと

伝票作成アプリの実装をしています。
現在Thinreportsを使った複数のデータ出力機能を実装中ですが、
データの埋め込み方法が考えつきません。

発生している問題・エラー

まず、アプリに関するデータの流れですが、
以下の画像のように、作成した伝票を保存する際、
「出荷先」、「出荷日」、「伝票番号」、「送り状ナンバー」の4情報は「slipsテーブル」に保存します。
また、下の商品登録欄に入力した商品情報は「ordersテーブル」に一括保存されるようにしています。

伝票作成画面からの処理の流れ.png

slipモデルとorderモデルに1対多のアソシエーションを組んであります。

app/models/slip.rb

class Slip < ApplicationRecord
  with_options presence: true do
    validates :address_name
    validates :shipping_date
    validates :slip_number, length: { maximum: 11 }
  end
  validates :invoice_number, length: { maximum: 11 }

  has_many :orders, dependent: :destroy 
  accepts_nested_attributes_for :orders, allow_destroy: true
end

app/models/order.rb

class Order < ApplicationRecord
  validates :note, length: { maximum: 50 }

  belongs_to :slip
end

伝票を保存する機能はうまくいっているため、
あとはこれをPDFとして画面出力する機能だけなのですが、
Thinreportsを用いて「リスト機能」を使えばよいというところまでは考えが至っているのですが、
具体的な実装方法が分かりません。

自分で試したこと

①Editorの方は以下のように実装しました。
thinreports editor画面.png

②Editorにidとして指定してある部分にデータを入れ込む記述をテキストエディタ上で行いました。
(伝票情報の入っている@slipというインスタンスを使用するために、slipsコントローラーにoutputアクションを定義してあります。)

app/controllers/slips_controller.rb

def output

    report = Thinreports::Report.new(layout: "#{Rails.root}/app/pdfs/easy_slips.tlf")

    # 少なくとも1枚はページがないと破損したPDF扱いになるので適当に作っておく
    report.start_new_page

    report.page.item(:address_name).value(@slip.address_name)
    report.page.item(:company).value(current_user.name)
    report.page.item(:shipping_date).value(@slip.shipping_date)
    report.page.item(:slip_number).value(@slip.slip_number)
    report.page.item(:invoice_number).value(@slip.invoice_number)

    file = report.generate

    send_data(
      file,
      filename: "easy_slips.pdf",
      type: "application/pdf",
      disposition: "inline")
  end

③ここから登録商品のデータを埋め込むために
1.伝票(slip)に紐づく商品を一つ一つ取り出す処理をする。(eachメソッドを使い、@slip.ordersのような記述で取り出す?)

2.その商品データをeditorに埋め込む記述を書く。(list機能を使う?)
 https://github.com/thinreports/thinreports-generator/blob/main/README.md#list

と、このように理論はわかるのですが、実践方法が思いつきません。
どなたかアドバイスいただけないでしょうか?

0

1Answer

自己解決しました!

以下のようなコードにより、
一つ一つ取り出した商品データをeditor上に一括で埋め込むことができました!
伝票出力コード.png

伝票出力editor画面.png

0Like

Your answer might help someone💌