

### 前提・実現したいこと

Ruby on Railsでアプリを作っています。  
画像を登録できるモデルがあるのですが、一度画像を削除して何もない状態からだと正常に画像を登録できるのですが、  
一度画像が登録されている状態で、他の画像に変更しようと更新すると、その画像が消えてしまい、なおかつ新しく  
登録したい画像もアップロードされていない状態になります。  
いままで幾つかアプリを同様の手順で作成していてこのような状況になったことがなく、以前作成したアプリと何か設定が違うのだと思うのですが、いろいろと設定まわりを見てみたのですが全く治らず困っております。  
もしこのあたりが怪しい、など分かりそうな方がいらっしゃいましたら教えていただけますでしょうか。  
情報の不足などもあれば追記しますので教えてください。よろしくお願いいたします。

### 発生している問題・エラーメッセージ

エラーメッセージ等は特に発生しておりません。

### 該当のソースコード

コントローラー

[code]

    class BadgesController < ApplicationController
      def create
        @badge = Badge.new(badge_params)
        if @badge.save
          flash[:success] = "新しいバッジを登録しました！"
          redirect_to home_path
        else
          render controller: 'badges', action: 'new'
        end
      end
    
      def update
        @badge = Badge.find(params[:id])
    
        if @badge.update(badge_params)
          # 保存に成功した場合はトップページへリダイレクト
          flash[:success] = "バッジを編集しました。"
          redirect_to home_path
        else
          # 保存に失敗した場合は編集画面へ戻す
          render controller: 'badges', action: 'edit'
        end
      end
    
      private
        def badge_params
          params.require(:badge)
            .permit(:name, :image, :remove_image, :image_cache)
        end
    end
    
[/code]

DB定義

[code]

        create_table :badges do |t|
          t.string :name
          t.string :image
          t.boolean :remove_image
          t.string :image_cache
    
          t.timestamps
        end
    
[/code]

uploader.rb

[code]

    # encoding: utf-8
    
    class ImageUploader < CarrierWave::Uploader::Base
      include CarrierWave::MiniMagick
    
      if Rails.env.production?
        include Cloudinary::CarrierWave
      else
        storage :file
      end
    
      def public_id
        model.id
      end
    
      def store_dir
        "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
      end
    
      process :resize_to_fit => [250, 250]
    
      def extension_white_list
        %w(jpg jpeg gif png)
      end
    
    end
    
[/code]

### 試したこと

開発環境（Cloud9）上で実行すると（Cloudinaryを使用していないからか）正常に画像更新もできます。  
Mini Magickが良くないのかと、Mini Magickを一度削除して更新しても、状況は変わらずでした。  
Rails4.2.5で作り直してもこれも状況が変わらずでした。  
Herokuのアプリを作り直して、Cloudinaryを新しくアドオンで追加し、CLOUDINARY_NAMEやCLOUDINARY_API_KEY等を  
改めてHerokuに登録し直してもなおりませんでした。

### 補足情報(言語/FW/ツール等のバージョンなど)

Ruby on Rails5.0.0.1  
Heroku  
Cloudinary + CarrierWave + Mini Magickで画像を登録しています。


CC BY-SA 4.0
2017-02-21T08:38:12.343
32836
2020-07-23T09:00:20.050
2019-04-20T15:45:02.340
76
20759
question
ruby-on-rails heroku
更新した時だけ画像がアップロードされない


html.erbのファイルの内容が書かれていませんが、  
画像の貼り付けは、image_tag で指定していますか？  
imagae_tag でないと上記の現象が起こるようです。  
間違っていたり、的外れな回答ならごめんなさい。。


CC BY-SA 3.0
2017-06-15T22:25:24.433
35617
2017-06-15T22:25:24.433
23820
32836
answer


関係ないかもしれませんが。  
carrierwave使っているなら。  
モデルの

[code]

    create_table :badges do |t|
      t.string :name
      t.string :image
      t.boolean :remove_image
      t.string :image_cache
    
      t.timestamps
    end
    
[/code]

この部分必要ありませんよ。

[code]

      t.boolean :remove_image
      t.string :image_cache
    
[/code]

そこを削除してみたらどうでしょうか？


CC BY-SA 3.0
2017-08-08T05:27:53.327
37010
2017-08-08T05:27:53.327
5436
32836
answer


上記の現象は Heroku に原因があるような気がします。

Heroku の dyno のファイルシステムは _ephemeral filesystem_ といって、  
_例えばアップロードデータなどの永続的なデータを保持することができません_ 。

# 解決策

Heroku を利用しつつファイルアップロードを実現するには、  
アップロードデータは dyno ではなく別の場所に保管しなければなりません。  
具体的には Amazon S3 等を検討してみてください。

* * *

余談ですが、CarrierWave は Amazon S3 を簡単な手順で使えるようです。  
参考：[Using Amazon S3](https://github.com/carrierwaveuploader/carrierwave#using-
amazon-s3)


CC BY-SA 4.0
2019-06-06T18:46:29.627
55593
2019-06-06T19:09:26.697
2019-06-06T19:09:26.697
8336
8336
32836
answer