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

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

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

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

Ruby on Rails 6

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

Q&A

解決済

1回答

995閲覧

作成したzipファイルをcarrierwaveでレコードに保存する方法について

ssk

総合スコア332

Ruby

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

Ruby on Rails 6

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

0グッド

0クリップ

投稿2022/08/28 15:27

編集2022/08/28 22:54

carrierwaveとrubyzipのgemを利用しています。
zipファイルを作成後、そのzipファイルの保存するところができません。
zipファイルをファイルとして認識していないことが原因かと思っています。
作成したzipファイルをcarrierwaveにファイルとして認識されるにはどうしたらよいでしょうか。

ruby

1class SendMaskInsuranceFile < ApplicationRecord 2 mount_uploader :csv_url, DocumentFileUploader 3 mount_uploader :zip_url, DocumentFileUploader 4 5def self.generate_pdf_file_with_save 6 ActiveRecord::Base.transaction do 7 SendMaskInsuranceFile.where(created_at: Time.current.yesterday..Time.current).each do |send_mask_insurance_file| 8 open(send_mask_insurance_file.csv_url.path) do |f| 9 csv = CSV.new(f, headers: :first_row) 10 csv.each do |row| 11 staff = Staff.find_by(id: row[3]) 12 if staff 13 mask_insurance_tempfile = Tempfile.new(["#{Time.current.to_i}", ".pdf"], Rails.root.join('tmp')) 14 zip = send_mask_insurance_file.generate_zip_file(mask_insurance_tempfile) 15 send_mask_insurance_file.update!(zip_url: zip.zipfile) 16 **↑エラーは起きませんがzipファイルの保存ができていません。** 17 mask_insurance_tempfile.close 18 end 19 end 20 end 21 end 22 end 23 end 24 25 def generate_zip_file(mask_insurance_tempfile) 26 zip_tempfile = Tempfile.new(["#{Time.current.to_i}", ".zip"], Rails.root.join('tmp')) 27 Zip::File.open(zip_tempfile.path, Zip::File::CREATE) do |zipfile| 28 zipfile.add(File.basename(mask_insurance_tempfile.path), mask_insurance_tempfile.path) 29 end 30 end 31end

追記

ruby

1 2class DocumentFileUploader < CarrierWave::Uploader::Base 3 include CarrierWave::MiniMagick 4 5 process :fix_exif_rotation, if: :image? 6 process :strip, if: :image? 7 8 version :thumb, if: :image? do 9 process resize_and_pad: [300, 300] 10 end 11 12 def store_dir 13 "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 14 end 15 16 def size_range 17 1..2.megabytes 18 end 19 20 def extension_allowlist 21 %w(jpg jpeg gif png pdf docx xlsx xlsm pptx doc xls ppt txt zip csv msg) 22 end 23 24 private 25 26 def image?(file) 27 file.content_type.include? 'image' 28 end 29end 30```追記

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

winterboum

2022/08/28 22:28

DocumentFileUploader を載せてください
ssk

2022/08/28 22:55

コメントありがとうございます。 情報を追記いたしました。
guest

回答1

0

ベストアンサー

extension_allowlist に zip が入ってないのでは、と予想してたのですが、入ってますね w

すると、拡張子が zip になっていないのかも、と思ったのですが、 Tempfile.new の書き方も問題なさそう。

すると私の未知の世界ですが、
generate_zip_file は Zip::File.open の結果を返しますが、Zip::File に zipfile という method見つからなかったのですが、有りますか?
zip_tempfile とか zip_tempfile.path を返すようにしてはどうでしょうか

投稿2022/08/29 00:06

winterboum

総合スコア23331

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ssk

2022/08/29 02:35

下記のzipfileはブロックの中で利用しているものになります。 Zip::File.open(zip_tempfile.path, Zip::File::CREATE) do |zipfile| zipfile.add(File.basename(mask_insurance_tempfile.path), mask_insurance_tempfile.path) end
ssk

2022/08/29 03:06

明示的にzip_tempfileを返したところ、無事保存することができました。 ご回答いただき、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問