thinreportsを使ったPDF出力機能の実装が上手くいきません
解決したいこと
ここに解決したい内容を記載してください。
Ruby on Railsで、「伝票作成アプリ」を実装しています。
作成した伝票をPDFとして出力する機能を作るところに着手しているのですが、
実装が上手くいきませんので、アドバイスをいただきたいです。
発生している問題・エラー
「PDF出力機能」を実装するために、
実際に出力する画面を視覚的に作成できる「Thinreports Editor」と、
そこにデータを埋め込むためのRubyのgemである「thinreports」を導入しました。
以下のようにコーディングし、アプリ画面の「pdf出力」ボタンを押すと、
「読み込めませんでした」という画面が出てしまいます。
エラーが起きている箇所のGyazo Gif
該当するソースコード
app/views/slips/show.html.erb
<div class="d-grid gap-5">
<h2 class="text-center bg-primary text-white">伝票詳細</h2>
<div class="container">
<div class="row">
<div class="col-md-6">
<th>【出荷先】</th>
<div class="form-control">
<%= @slip.address_name %>
</div>
</div>
<div class="col-md-6">
<th>【送り主】</th>
<p class="h2">
<%= current_user.name %>
</p>
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="col-md-4">
<th>【出荷日】</th>
<div class="form-control">
<%= @slip.shipping_date %>
</div>
</div>
<div class="col-md-4">
<th>【伝票番号】</th>
<div class="form-control">
<%= @slip.slip_number %>
</div>
</div>
<div class="col-md-4">
<th>【送り状ナンバー】</th>
<div class="form-control">
<% if @slip.invoice_number.present? %>
<%= @slip.invoice_number %>
<% else %>
なし
<% end %>
</div>
</div>
</div>
</div>
<div class="container">
<table class="table">
<thead>
<tr>
<th>品番</th>
<th>色</th>
<th>数量</th>
<th>備考</th>
</tr>
</thead>
<tbody class="bulk-registration-form">
<% @slip.orders.each do |order| %>
<% if order.order_number.present? %>
<tr class="item">
<td>
<%= order.order_number %>
</td>
<td>
<%= order.color %>
</td>
<td>
<%= order.count %>
</td>
<td>
<%= order.note %>
</td>
</tr>
<% end %>
<% end %>
</tbody>
</table>
</div>
</div>
<div class="text-center mt-3">
<%= link_to "PDF出力", slip_pdfs_path(@slip.id), class: 'btn btn-danger' %>
<%= link_to "編集", edit_slip_path(@slip.id), class: 'btn btn-primary' %>
<%= link_to "削除", slip_path(@slip.id), method: :delete, class: 'btn btn-primary' %>
</div>
<div class="text-center mt-3">
<%= link_to "戻る", slips_path, class: 'btn btn-success' %>
</div>
@slipというインスタンスに個別の伝票情報が格納されており、それを詳細画面で表示するためのコードです。
下の方にPDF出力のための「link_toメソッド」を記述しており、
PDF出力用のコントローラーで伝票情報を扱えるようにしようと考え、
パスをそのように記述しました。
config/routes.rb
Rails.application.routes.draw do
devise_for :users
root "tops#index"
resources :products, only:[:new, :create]
resources :clients, only:[:new, :create]
resources :slips do
resources :pdfs, only: :index
end
end
ネスト構造を利用して、行き先のpdfsコントローラーのindexアクションで伝票情報を扱えるようにしようと考えました。
app/controllers/pdfs_controller.rb
class PdfsController < ApplicationController
def index
report = Thinreports::Report.new(layout: "#{Rails.root}/app/pdfs/hello_world.tlf")
file = report.generate(filename: 'hello_world.pdf')
send_data(
file,
filename: "hello_world.pdf",
type: "application/pdf",
disposition: "inline")
end
end
tinreports公式のガイドを参考に、まずは試しに出力だけでもできるかどうか試してみることにし、
PDF出力のためのコードを書きました。
うまく動作すれば、下の画像の通りのPDFが出力されるはずです。
自分で試したこと
自分で立てた仮説は以下の通りです。
①エディターのバージョンが古いのではないか?
②ルーティングの設定方法に問題があるのではないか?
③コントローラーの記述に問題があるのでは?
①に関しては、thinreportsの公式ガイドにあったスタートアップガイドに沿って試作をしてみたところ、
正しく動作したので、問題ないと考えています。
②に関しては、PDF出力時にthinreports editorに伝票の情報を埋め込むためにルーティング時点で送っておかなければならないと考えた実装ですが、問題があるのかどうかわかりません。
③に関しては、thinreportsファイルを呼び出し、ブラウザ上にPDFを出力するための記述をしているので問題はないと考えています。
以上、②③あたりに関して何か問題があるのかどうか、また別に問題があるのかどうか、
もしお気づきの点がありましたら教えていただきたいです。