質問みてくださりありがとうございます。
前情報
Rails/React/Dockerでアプリ製作中です。
Userのアバターを登録できるようするために、carrierwaveを使っています。
また、編集ページで登録したアバターを変更できるようにしました。
開発環境では、アバター画像の保存先を
Railsアプリ名/public/uploads/user/:user_id/avatar.jpgとし、
React側には画像のURL(ex:http://localhost:3000/uploads/user/avatar/100/avatar.jpeg)
を送ることで、アバターを表示できるようにしました。
起きた問題
最初にアバターを登録すると、
保存先のRailsのディレクトリに正しく保存され、React側でも正しく表示されました。
しかし、次に新しいアバターに編集すると、
保存先のRailsのディレクトリには正しく保存(更新)されますが、React側の表示が編集前の画像のままです。
アドレスバーに直打ちで
http://localhost:3000/uploads/user/avatar/100/avatar.jpeg
とすると以前に登録されている画像のままで、更新がうまくできていないようです。
試してみたこと
-
ブラウザにキャッシュされているのかな?と思いキャッシュを削除。
-
Rails/React共に再起動しました。
どちらもダメでした。
知りたいこと、疑問点
- Port3000で参照しているavatar.jpegと、Railsディレクトリに保存されているavatar.jpegとが違う理由がよくわからない。
→なぜリンクしていないのか。
2. Railsはどこから、どうやって保存した画像を参照しているのか?
3. Dockerを使って開発しているので、自分で気づけていない何か問題があるのではないか?
4. そもそも、Railsで更新がうまく行っておらず、DBは以前のままで、ディレクトリの画像だけが更新されているのか?
最後に
最後までみてくださりありがとうございます。
ヒント若しくは、解決策がわかる方いらっしゃいましたら、ご教授よろしくお願いします。
追加で必要な情報があれば追加させていただきます。
追記
docker-compose run すると変更が直後のみ反映されました。
しかし、リアルタイムに同期されないのはなぜなんでしょうか・・・・
毎回runするわけには行かないし。。。
docker
1version: '3' 2services: 3 api: 4 build: ./rails 5 ports: 6 - '3000:3000' 7 command: /bin/sh -c "bundle exec rails s -p 3000 -b '0.0.0.0'" 8 volumes: 9 - ./rails:/app:cached 10 - bundle:/usr/local/bundle:cached 11 depends_on: 12 - psql 13 psql: 14 image: postgres 15 volumes: 16 - psql:/var/lib/postgresql/data 17 ports: 18 - '5432:5432' 19 20volumes: 21 psql: 22 bundle:
追記2
試しに、保存するアバターのファイル名をavatar.jpg→ランダムな文字列.jpegに変更すると、
アバターを編集するリクエスト後に帰ってくる、アバターのURLと
(ex:http://localhost:3000/uploads/user/avatar/37/**c6c2151a-7ddb-4270-adb2-0e1b6323ed8c.jpeg**)
その後、Profileページを表示するリクエスト後のレスポンスに含まれているアバターのURL(ex:http://localhost:3000/uploads/user/avatar/37/**9ae5f22c-4179-4d1a-951e-1d7241b1c38b.jpeg**)
が違うことに気付きました。
前者のURLには正しく画像が表示され、後者のURLにはNo route matchesと画像の表示はされません。
以降、リクエストのたびに後者のURLが送られてきます。
なぜ....
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/07 21:56