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

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

ただいまの
回答率

87.80%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 232

score 428

前提

rails5.2で動作していたプログラム(画像の登録)をrails6に移行中です。

ソースは変更なしの状態で、そのままrails6で動かすと画像登録はできるのですが、
親子の関連付けが無効(ディレクトリが親子関係なし)の状態で登録されます。

rails5.2は、cloud9
rails6は、Ubuntuになります。
carrierwave (2.1.0)です。

発生している問題

正しくは親ディレクトリにItem_id、その中に画像ファイルが保存されます。
以下ですと「9」がItem_idです。
イメージ説明

それが移行先だと、単に画像のid(Imageのid)で保存されてしまいます。
イメージ説明

画像ファイル自体は作成されており、
「親モデルのidディレクトリ」が作られて、その中に画像がない とい点だけが問題です。
※画像ファイル名も問題ありませんでした

該当のソースコード

ItemとImageを関連付けしてます。

#Itemモデル
class Item < ApplicationRecord
  has_many :images, dependent: :destroy
    accepts_nested_attributes_for :images, allow_destroy: true
end

#Imageモデル
class Image < ApplicationRecord
  mount_uploader :src, ImageUploader

  belongs_to :item, optional: true

  validates :src, presence: true
end

アップローダー
\app\uploaders\image_uploader.rb

class ImageUploader < CarrierWave::Uploader::Base
    # Include RMagick or MiniMagick support:
    # include CarrierWave::RMagick
    # include CarrierWave::MiniMagick

    include CarrierWave::MiniMagick
    #process resize_to_limit: [100, 100]
    process resize_to_fill: [600, 600, "Center"]
    #process resize_to_fit: [200, 200]

    # Choose what kind of storage to use for this uploader:
    storage :file
    # storage :fog

    # Override the directory where uploaded files will be stored.
    # This is a sensible default for uploaders that are meant to be mounted:
    def store_dir
      "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
    end

    # Provide a default URL as a default if there hasn't been a file uploaded:
    # def default_url(*args)
    #   # For Rails 3.1+ asset pipeline compatibility:
    #   # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
    #
    #   "/images/fallback/" + [version_name, "default.png"].compact.join('_')
    # end

    # Process files as they are uploaded:
    # process scale: [200, 300]
    #
    # def scale(width, height)
    #   # do something
    # end

    # Create different versions of your uploaded files:
     version :thumb do
       process resize_to_fit: [50, 50]
     end

    # Add a white list of extensions which are allowed to be uploaded.
    # For images you might use something like this:
    def extension_whitelist
      %w(jpg jpeg gif png)
    end

    # Override the filename of the uploaded files:
    # Avoid using model.id or version_name here, see uploader/store.rb for details.
  #   def filename

  #     logger = Logger.new(STDOUT)
  #     logger.debug "++++++ filename : #{original_filename}"

  #     #"something.jpg" if original_filename
  #     "#{secure_token}_#{original_filename}" if original_filename.present?

  #   end

  # protected
  #   def secure_token
  #     var = :"@#{mounted_as}_secure_token"
  #     model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.uuid)
  #   end

end

試したこと

DBを確認すると、ImageモデルのItem_idは正常に入っていました。

Uploaderの
store_dirメソッドがディレクトリを決定している部分かと思うのですが、特に変更はしてないです。

どこが怪しそうでしょうか?

ここを調べたら?といったことでも構いません。
先輩方、アドバイス宜しくお願いします。

追記

まだ解決はしてないのですが関係してるかもしれない部分が分かりました。

new.html.erbで、子にあたる画像を以下のように出力してますが

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

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

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

お騒がせしました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る