TransWikia.com

更新した時だけ画像がアップロードされない

スタック・オーバーフロー Asked by waspman on December 9, 2021

前提・実現したいこと

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

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

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

該当のソースコード

コントローラー

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

DB定義

    create_table :badges do |t|
      t.string :name
      t.string :image
      t.boolean :remove_image
      t.string :image_cache

      t.timestamps
    end

uploader.rb

# 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

試したこと

開発環境(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で画像を登録しています。

3 Answers

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

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

解決策

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


余談ですが、CarrierWave は Amazon S3 を簡単な手順で使えるようです。
参考:Using Amazon S3

Answered by komiyak on December 9, 2021

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

create_table :badges do |t|
  t.string :name
  t.string :image
  t.boolean :remove_image
  t.string :image_cache

  t.timestamps
end

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

  t.boolean :remove_image
  t.string :image_cache

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

Answered by ted on December 9, 2021

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

Answered by HogeTaro on December 9, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP