質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

受付中

Tempfileで作成したPDFファイルがスクリプト実行中に削除されてしまう

ssk
ssk

総合スコア328

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

2回答

0リアクション

0クリップ

195閲覧

投稿2022/09/25 10:07

編集2022/09/26 00:31

1行のCSVデータでは問題なくzipファイルをモデルに保存できますが、複数行のCSVデータでは
No such file or directoryとなり、zipファイルをモデルに保存することができませんでした。

tmp/以下のディレクトリを実行中に見ると、勝手にPDFファイルが削除されているようでした。
以下、コードになります。ご教授いただけますと幸いです。

ruby

class SendMaskInsuranceFile < ApplicationRecord mount_uploader :csv_url, DocumentFileUploader mount_uploader :zip_url, ZipFileUploader validates :csv_url, presence: true def self.generate_mask_insurance_zip_file ActiveRecord::Base.transaction do SendMaskInsuranceFile.where(created_at: Time.current.yesterday..Time.current).each do |send_mask_insurance_file| Tempfile.create(["#{Time.current.to_i}", ".zip"], Rails.root.join('tmp')) do |zip_tempfile| Zip::File.open(zip_tempfile.path, Zip::File::CREATE) do |zipfile| URI.open(send_mask_insurance_file.csv_url.path) do |f| csv = CSV.new(f, headers: :first_row) csv.each do |row| staff_master = StaffMaster.find_by(id: row[5]) employment_file = staff_master.original_insurance_files.where(file_type: :social).order(id: :desc).first social_file = staff_master.original_insurance_files.where(file_type: :employment).order(id: :desc).first if staff_master pdf_string = WickedPdf.new.pdf_from_string( ActionController::Base.new().render_to_string( template: '/admins/send_mask_insurance_files/sended.pdf.slim', layout: 'layouts/pdf.pdf.slim', encoding: 'utf-8', locals: { postal_code: row[3], address: row[4], company_name: row[2], department_name: row[1], employment_file: employment_file.blank? ? nil : embed_remote_image(employment_file.url.path, 'image/jpeg'), social_file: social_file.blank? ? nil : embed_remote_image(social_file.url.path, 'image/jpeg'), } ) ).force_encoding("UTF-8") Tempfile.create(["#{staff_master.id}-#{Time.current.to_i}", ".pdf"], Rails.root.join('tmp')) do |mask_insurance_tempfile| mask_insurance_tempfile.write pdf_string zipfile.add(File.basename(mask_insurance_tempfile.path), mask_insurance_tempfile.path) end end end end end send_mask_insurance_file.update!(zip_url: zip_tempfile) end end end end def self.embed_remote_image(url, content_type) asset = URI.open(url, "r:UTF-8", &:read) base64 = Base64.encode64(asset.to_s).gsub(/\s+/, "") "data:#{content_type};base64,#{Rack::Utils.escape(base64)}" end end

実行コマンド

bundle exec rake cron:generate_mask_insurance_zip_file

エラーメッセージ

[START] [{:generate_mask_insurance_zip_file=>:environment}] (2022/09/26 09:28) [ERROR] No such file or directory @ rb_sysopen - /Users/●●/Dropbox/sites/app/tmp/02393164-166415211720220926-1793-w6nj56.pdf (2022/09/26 09:28) rake aborted! Errno::ENOENT: No such file or directory @ rb_sysopen - /Users/●●/Dropbox/sites/app/tmp/02393164-166415211720220926-1793-w6nj56.pdf /Users/●●/Dropbox/sites/app/app/models/send_mask_insurance_file.rb:11:in `block (3 levels) in generate_mask_insurance_zip_file' /Users/●●/Dropbox/sites/app/app/models/send_mask_insurance_file.rb:10:in `block (2 levels) in generate_mask_insurance_zip_file' /Users/●●/Dropbox/sites/app/app/models/send_mask_insurance_file.rb:9:in `block in generate_mask_insurance_zip_file' /Users/●●/Dropbox/sites/app/app/models/send_mask_insurance_file.rb:8:in `generate_mask_insurance_zip_file' /Users/●●/Dropbox/sites/app/lib/tasks/cron.rake:98:in `block (2 levels) in <main>' /Users/●●/Dropbox/sites/app/lib/tasks/cron.rake:7:in `block in task_with_logger_and_notify' /Users/●●/.rbenv/versions/2.7.6/bin/bundle:23:in `load' /Users/●●/.rbenv/versions/2.7.6/bin/bundle:23:in `<main>' Tasks: TOP => cron:generate_mask_insurance_zip_file (See full trace by running task with --trace)

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

winterboum

2022/09/25 12:18

エラーメッセージは全文載せてください
ssk

2022/09/25 12:30

ありがとうございます。 エラーメッセージを追加いたしました。
winterboum

2022/09/25 13:48

send_mask_insurance_file.rb:10 って zip_tempfile = Tempfile.new(["#{Time.current.to_i}", ".zip"], Rails.root.join('tmp')) ですか?
ssk

2022/09/25 14:04

10行目は以下になります。 Zip::File.open(zip_tempfile.path, Zip::File::CREATE) do |zipfile|
winterboum

2022/09/25 14:33

とすると、エラーメッセージが出たのは載せてある class SendMaskInsuranceFile とは別物ですね。 8行目が generate_mask_insurance_zip_file 9行目が block in generate_mask_insurance_zip_file だと言ってますから 載せてるfileだとすると 10行目は SendMaskInsuranceFile.where(created_at: になりますが。
ssk

2022/09/25 14:48

申し訳ございません。 余計な改行が入っていました。 正しくは11行目が以下になります。 Zip::File.open(zip_tempfile.path, Zip::File::CREATE) do |zipfile| 内容も修正いたしました。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。