前提
rails5.2で動作していたプログラム(画像の登録)をrails6に移行中です。
ソースは変更なしの状態で、そのままrails6で動かすと画像登録はできるのですが、
親子の関連付けが無効(ディレクトリが親子関係なし)の状態で登録されます。
rails5.2は、cloud9
rails6は、Ubuntuになります。
carrierwave (2.1.0)です。
発生している問題
正しくは親ディレクトリにItem_id、その中に画像ファイルが保存されます。
以下ですと「9」がItem_idです。
それが移行先だと、単に画像のid(Imageのid)で保存されてしまいます。
画像ファイル自体は作成されており、
「親モデルのidディレクトリ」が作られて、その中に画像がない
とい点だけが問題です。
※画像ファイル名も問題ありませんでした
該当のソースコード
ItemとImageを関連付けしてます。
ruby
1#Itemモデル 2class Item < ApplicationRecord 3 has_many :images, dependent: :destroy 4 accepts_nested_attributes_for :images, allow_destroy: true 5end 6 7#Imageモデル 8class Image < ApplicationRecord 9 mount_uploader :src, ImageUploader 10 11 belongs_to :item, optional: true 12 13 validates :src, presence: true 14end 15
アップローダー
\app\uploaders\image_uploader.rb
ruby
1 2class ImageUploader < CarrierWave::Uploader::Base 3 # Include RMagick or MiniMagick support: 4 # include CarrierWave::RMagick 5 # include CarrierWave::MiniMagick 6 7 include CarrierWave::MiniMagick 8 #process resize_to_limit: [100, 100] 9 process resize_to_fill: [600, 600, "Center"] 10 #process resize_to_fit: [200, 200] 11 12 # Choose what kind of storage to use for this uploader: 13 storage :file 14 # storage :fog 15 16 # Override the directory where uploaded files will be stored. 17 # This is a sensible default for uploaders that are meant to be mounted: 18 def store_dir 19 "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 20 end 21 22 # Provide a default URL as a default if there hasn't been a file uploaded: 23 # def default_url(*args) 24 # # For Rails 3.1+ asset pipeline compatibility: 25 # # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_')) 26 # 27 # "/images/fallback/" + [version_name, "default.png"].compact.join('_') 28 # end 29 30 # Process files as they are uploaded: 31 # process scale: [200, 300] 32 # 33 # def scale(width, height) 34 # # do something 35 # end 36 37 # Create different versions of your uploaded files: 38 version :thumb do 39 process resize_to_fit: [50, 50] 40 end 41 42 # Add a white list of extensions which are allowed to be uploaded. 43 # For images you might use something like this: 44 def extension_whitelist 45 %w(jpg jpeg gif png) 46 end 47 48 # Override the filename of the uploaded files: 49 # Avoid using model.id or version_name here, see uploader/store.rb for details. 50 # def filename 51 52 # logger = Logger.new(STDOUT) 53 # logger.debug "++++++ filename : #{original_filename}" 54 55 # #"something.jpg" if original_filename 56 # "#{secure_token}_#{original_filename}" if original_filename.present? 57 58 # end 59 60 # protected 61 # def secure_token 62 # var = :"@#{mounted_as}_secure_token" 63 # model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.uuid) 64 # end 65 66end
試したこと
DBを確認すると、ImageモデルのItem_idは正常に入っていました。
Uploaderの
store_dirメソッドがディレクトリを決定している部分かと思うのですが、特に変更はしてないです。
どこが怪しそうでしょうか?
ここを調べたら?といったことでも構いません。
先輩方、アドバイス宜しくお願いします。
追記
まだ解決はしてないのですが関係してるかもしれない部分が分かりました。
new.html.erbで、子にあたる画像を以下のように出力してますが
ruby
1<%= f.fields_for :images do |image| %>
この「f.fields_for」で出力されるhtmlがrails5と6で違ってました。
rails5.2
name="item[images_attributes][0][src][]"
rails6
name="item[item_images][src][]"
これが原因だと思いますが、ではどうすれば解消するのかまだ分かりません。
ドキュメントを見ましたがバージョンによる挙動の違いは見つけれませんでした。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。