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

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

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

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

Q&A

解決済

1回答

2380閲覧

Carrierwave S3に保存したファイルと別の名前がデータベースに保存される

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails

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

0グッド

1クリップ

投稿2019/03/25 10:06

編集2019/03/25 11:43
def filename if original_filename.blank? return end "#{SecureRandom.hex(5)}#{File.extname(original_filename)}" end

Uploader のファイル名をこんな感じで決めているのですが

def filename if original_filename.blank? return end tmp = "#{SecureRandom.hex(5)}#{File.extname(original_filename)}" puts tmp tmp end

のようにデバッグメッセージをはさんでみると
update 時に計4回よばれていて最初の3回は同じなのですが最後の1回だけ別の名前になってしまいます
S3に保存されているのは最後の1回の名前で データベースに入ってるのは最初の3回の名前になっています

なぜこういうことがおこるのでしょうか
そもそも4回呼ばれる理由もわからないのですが
Carrierwave はブラックボックスが多すぎて原因が全くわからずどこからデバッグすればいいのでしょうか…

追記

def filename Util.log @f if original_filename @f ||= "#{SecureRandom.hex(5)}#{File.extname(original_filename)}" end Util.log @f @f end

のようにログを増やしてみたのですが
最後の1回だけ @f が nil になってしまいます
なので別にインスタンスが作られているとしか思えません…

Util.log caller.select{|r| r.index('/home') == 0}.join("\n")

トレースをはさんでみたのですが4回とも同じコントローラーの update から呼び出されていました

コントローラはほとんど手を付けていないデフォルトです
もちろんその update が実行されたのは1回だけです

def update Util.log 'update' respond_to do |format| if @user.update(user_params)

もうわけがわかりません

追記

class UserImageUploader < ImageUploader # リサイズしたり画像形式を変更するのに必要 include CarrierWave::MiniMagick process :store_dimensions # サイズを半分にしたものを生成してそのサイズを保存する version :half do process :resize end def resize Util.log 'resize' resize_to_fit model.resize[0], model.resize[1] end def store_dimensions if file && model resize = MiniMagick::Image.open(file.file).dimensions resize[0] = resize[0] / 2 resize[1] = resize[1] / 2 model.resize = resize end end end def url "#{Settings.api.images}#{self.half.current_path}" end

このリサイズしたバージョンのイメージを作らなければ2回呼ばれるだけで正常に保存できるようです

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

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

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

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

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

guest

回答1

0

ベストアンサー

carrierwaveのwikiによると
ランダムな名前を生成するには

ruby

1class PhotoUploader < CarrierWave::Uploader::Base 2 def filename 3 "#{secure_token(10)}.#{file.extension}" if original_filename.present? 4 end 5 6 protected 7 def secure_token(length=16) 8 var = :"@#{mounted_as}_secure_token" 9 model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.hex(length/2)) 10 end 11end

とするそうです。

投稿2019/03/25 13:02

asm

総合スコア15147

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

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

退会済みユーザー

退会済みユーザー

2019/03/26 02:37

ありがとうございます! マルチバージョンかつランダムの場合はモデルに関連付けてファイル名を生成する必要があるのですね あと wiki も教えていただいてありがとうございます carrierwave 関連でよく詰まるので1度読んでみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問