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

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

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

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

Q&A

3回答

5065閲覧

carrierwaveでデフォルトの保存先を変更したい

shumbow

総合スコア35

Ruby on Rails 5

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

0グッド

1クリップ

投稿2019/07/04 14:37

編集2022/01/12 10:55

carrierwaveで画像ファイルをアップロードする機能を実装していて、保存まで成功したのですが、プライバシーに関わるような画像はpublicフォルダーには置かない方が良いということだったので、キャッシュファイルや画像の保存場所をtmpディレクトリにしようと思っているのですが、できません。ここを参考にしました。CarrierWaveでUploaderごとに保存するディレクトリを変える

rb

1 2##uploader 3def store_dir 4 "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 5 end 6 7 def cache_dir 8 'cache' 9 end 10 11 def root 12 "#{Rails.root}/tmp" 13 end

このとき<%= image_tag @model.image.url >での画像の表示が、文字化けが発生してうまくいきません。
イメージ説明

ルート変更後の画像表示がエラー

Started GET "/cache/1562256626-32441-0012-8251/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2019-05-13_0.23.23.png" for ::1 at 2019-07-05 01:10:34 +0900 ActionController::RoutingError (No route matches [GET] "/cache/1562256626-32441-0012-8251/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2019-05-13_0.23.23.png"):

一応画像のパスは byebugで確認したところ期待通りの場所をさしていました。

(byebug) @model.image.path "/Users/Application/MyApp/tmp/uploads/tmp/1562254548-32226-0001-0551/スクリーンショット_2019-05-01_6.05.02.png"

どこかおかしいところを指摘してくださる方ございませんでしょうか?

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

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

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

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

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

guest

回答3

0

>スクリーンショット_2019-05-13_0.23.23.png の方がありました。
ということは、carrierwave の日本語対応 がうまく行っていないのでは、と思います。
私はこういうことが起きるのが嫌なので、日本語でなければならない時以外は避けて居ます。ので、carrierwaveの日本語対応については経験がないので、ここはパス。

# def filename # "something.jpg" if original_filename # end

というのが一番したの方にありませんか?
ここでASCIIな格納用のfile名にするという方法があります。
それで格納file名を非日本語化したらどこまで進むでしょう

投稿2019/07/10 02:42

winterboum

総合スコア23284

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

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

0

私も混乱してきた。一歩ずつ進めましょう。
まず期待通りにしまわれているか。

def store_dir "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" end def root "#{Rails.root}/tmp" end

として
>期待通り
"/Users/Application/MyApp/tmp/uploads/tmp/1562254548-32226-0001-0551/スクリーンショット_2019-05-01_6.05.02.png"

とのことですが、これ改めて見て???
1)モデルって Tmp という名前ですか?
2)mounted_as が 1562254548-32226-0001-0551 である?のは良いとして
3)model.id wdir名の最後に指定してあるのに、直下にファイルが来ています。

store_dirの指定通りの階層にあり、かつ日本語のない名前になっているか、まず

投稿2019/07/07 08:26

winterboum

総合スコア23284

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

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

0

画像の保存は publicで無いところに無事保管されています。
ですから path が見つからないというエラーになっています。

public以下にないので、そのままではアクセスできません。
<%= image_tag @model.image.to_s %>
してみて下さい

投稿2019/07/04 15:19

winterboum

総合スコア23284

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

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

shumbow

2019/07/04 15:52 編集

ありがとうございます!やってみましたが、画像の表示、エラー共に治りませんでした。<%= image_tag @model.image.url >と.to_sを差し替えても同じように動くのですが、何か違いはあるのでしょうか? また、ルートがpublicの時はテキストエディタから、アップロードしたファイルがついかされているのが目に見えたのですが、tmpの場合は見えていなくても問題ないということでしょうか?
winterboum

2019/07/04 21:30

.url と .to_s は動きが違います。 で、 >tmpの場合は見えていない とすると、問題ありですね。carrierwaveはしまったつもりだがそうなっていない。 saveのときにエラーがでているとかはなかったですか?
winterboum

2019/07/04 21:33

あ、storedirが、おかしいかな。 いま時間ないのであとで。
shumbow

2019/07/05 02:07

ありがとうございます!
shumbow

2019/07/05 02:15

保存はうまくいってるみたいです。dbbrowserで確認してもカラムに値は入っています。
winterboum

2019/07/05 21:27 編集

調べたり確認したりの時間が取れないので、記憶頼りですが 保存がうまく行っているかどうかは、DBではなく、 #{Rails.root}/tmp/uploads の下に実際にあるかどうか確認して下さい。 DBの情報は「そこに格納した」という記録だけです。 もし実際に保存されているとするt,日本語が使われているのが原因かもしれません。 %E3%82%B9%E3% というのは文字化けではなく、URLに日本語が使われた時に行われる変換ですが、これが影響しているのか、と 英数字だけにしてみるか、「carrierwaveで日本語を使えるようにする」という記事をどこかで見た覚えがあるので、それを探していただくか、してみて下さい
shumbow

2019/07/07 02:46

ありがとうございます。頑張って探してみます。たしかに画像名に日本語が入ってる気がします。
shumbow

2019/07/07 06:18

日本語に対応してみたのですが変わりませんでした。 config/initializers/carrierwave.rbにCarrierWave::SanitizedFile.sanitize_regexp = /[^[:print:]]/ と記述しました。 またpublic以外の場所からデフォルトで読み出すことはできない的な情報があったので(参考にした記事)→https://spitfire-tree.hatenadiary.org/entry/20120127/1327660951、やってみましたがそもそも実際にtmp以下に保存できていないらしく、Errno::ENOENT (No such file or directory @ rb_sysopen - /Users/Application/MyApp/tmp/cache/1562479771-39675-0001-6550/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2019-05-13_0.23.23.png) となってしまいました。
shumbow

2019/07/07 06:20

読み出し専用のコントローラをつくりました class AttachmentController < ApplicationController def show full_path = "#{Rails.root}" + "/tmp" + params[:path] image = File.binread(full_path) send_data image, disposition: :inline end end
winterboum

2019/07/07 08:12

publicに無いとアクセスできない、というのは本当です。 ですが、エラーメッセージの前をみると Started GET "/cache/1562256626-32441-0012-8251/ となっているので、 public/cache を読ませに行ってます。 ``` def cache_dir 'cache' end ``` という使い方はしたことがないのですが、これから予想するに image_tag @model.image.url とした場合、public/cacheに一時保存してそのURLを返しているのかな?と(すると image_tag @model.image.to_s はストリームで返しているのかな。) ああ、読み出し専用はそうしてますね
shumbow

2019/07/09 06:43

おっしゃる通りモデル名はtmpではないので、一回carrierwaveのルート定義やcache_dirメソッドを消してデフォルトの状態 (store_dirのみ)でやり直してみたところ、そのtmpはcache_dirメソッドが定義されていない時のデフォルトのキャッシュの置き場になっていました。そのときの@model.image.urlは/uploads/tmp/562653024-1590-0001・・・で、これは”キャッシュファイル”の保存先でした。大切なことをお伝えしていなかったのですが、自分はフォームに確認画面を設置していて、そこで一度プレビューしているのですが、そこではキャッシュファイルを参照しています。
shumbow

2019/07/09 06:50

cache_dir自体はちゃんと動いてるみたいで、rootをtmpにした状態で(byebug) @model.image.to_sは "/cache/1562654239-1675-0001-9838/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2019-05-13_0.23.23.png"になっていて、 @model.image.pathは/Users/Application/MyApp/tmp/cache/1562654239-1675-0001-9838/スクリーンショット_2019-05-13_0.23.23.png"となっていたので多分最初からおっしゃっていた通り、定義はできているけどcarrierwaveがしまったつもりでいるだけなのかと思います
winterboum

2019/07/09 06:59

ls /Users/Application/MyApp/tmp/cache/1562654239-1675-0001-9838 すると スクリーンショット_2019-05-13_0.23.23.png がありますか? それとも %E3%82%B9%E3%82%A。。。。.pmg がありますか?
shumbow

2019/07/10 01:33

ありがとうございます。確認してみたところスクリーンショット_2019-05-13_0.23.23.png の方がありました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問