質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

635閲覧

【carrierwave】f.fields_forで出力されるhtmlがrails5と6で違うせい?attributesが無効で登録される

pecchan

総合スコア555

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/01/15 01:46

編集2021/01/15 05:52

前提

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][]"

これが原因だと思いますが、ではどうすれば解消するのかまだ分かりません。
ドキュメントを見ましたがバージョンによる挙動の違いは見つけれませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

よくよく確認するとshow側は変更なく画像参照も出来ました。
つまり画像ファイルが出来上がるディレクトリは変わりましたが、ソース側を変更する必要がなく、現状特に問題ありません。

厳密には解決ではないのですが、特に問題ないためクローズさせていただきます。

お騒がせしました。

投稿2021/01/16 03:29

pecchan

総合スコア555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問