スタック・オーバーフロー 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に登録し直してもなおりませんでした。
Ruby on Rails5.0.0.1
Heroku
Cloudinary + CarrierWave + Mini Magickで画像を登録しています。
上記の現象は 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
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP