kmjooh
@kmjooh (Masayuki Kamijo)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

エラーの解決方法教えてください【undefined method `url' for "#<ActionDispatch::Http::UploadedFile:0x00007f2f31890b68>":String】

解決したいこと

carrierwaveで画像のアップロードを行おうとしておりますが、以下のようなエラーが出ました。

undefined method `url' for "#ActionDispatch::Http::UploadedFile:0x00007f2f31890b68":String

Image from Gyazo

色々と調べて試してみましたが、上手くいきませんでした。
是非解決方法を教えてください。

該当するソースコード

recipes/show.html.erb
<div>
  <% @how_to_makes.each do |process| %>
    <ol>
      <li>
        <%= image_tag process.process_image.url if process.process_image? %>
        <%= process.explanation %>
      </li>
    </ol>
  <% end %>
</div>

他関連ソースコード

色々と試してみて現在は以下のようなコードになっています。

recipe.rb
mount_uploader :process_image, ProcessImageUploader
recipes_controller.rb
class RecipesController < ApplicationController
  before_action :require_user_logged_in, only: [:new, :create, :edit, :update, :destroy]


  def show
    @recipe = Recipe.find(params[:id])
    @recipe_ingredients = @recipe.recipe_ingredients.all
    @how_to_makes = @recipe.how_to_makes.all
  end


  private

  def recipe_params
    params.require(:recipe).permit(:title, :catchcopy, :no_of_dish, :image, 
                                  recipe_ingredients_attributes:[:id, :recipe_id, :ing_name, :quantity, :_destroy],
                                  how_to_makes_attributes:[:id, :explanation, :process_image, :order_no, :_destroy])
  end
end
process_image_uploader.rb
class ProcessImageUploader < CarrierWave::Uploader::Base
  # Include RMagick or MiniMagick support:
  # include CarrierWave::RMagick
  include CarrierWave::MiniMagick

  # 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

  def extension_whitelist
    %w(jpg jpeg gif png)
  end

  process resize_to_fill: [100, 100, "Center"]

  # 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
  #   "something.jpg" if original_filename
  # end
end
Gemfile
gem 'carrierwave'
gem 'mini_magick'

よろしくお願いします!

0

1Answer

Comments

  1. @kmjooh

    Questioner

    ありがとうございます!
    その場合はどうすれば解決できますでしょうか?
  2. まず、原因については、

    直前に投稿されている質問
    https://qiita.com/kmjooh/questions/4be017a50c08525b0911


    migrate/20210116144054_create_how_to_makes.rb


    process_imageをstring型として定義されているように見受けられますので、先日記載した上記のコメントの通り、string型にはurlプロパティがありません となります。

    どうすればいいか、については、やりたいことと、使用しているライブラリとかによるかと思いますのでなんとも言えないです。
  3. @kmjooh

    Questioner

    前の質問などもご覧いただきありがとうございます。
    そちらもstringからbinaryに変更したりして試しておりますが、変わらず同じエラーが起こってしまっている状況です。。。
    やりたいことに関しましては、Recipeテーブルの子テーブルであるHowToMakeのprocess_imageカラムの画像を表示したいです。
    レシピサイトでよくある、料理の作成工程の写真がいくつか掲載されているようなものをイメージしております。複数画像を表示することになりますので、@how_to_makes.eachとしています。
  4. 下記の質問

    https://teratail.com/questions/185008

    に対する下記の回答が該当しているかもしれません。
    (推測でしかないですが。。。)
    画像の保存にいくまでに他のカラムでエラーになっていないか確認してみるのがよいかと思います。

    >他の質問から CarrierWave を使っている
    >非常にややこしいのですがサブモデルでcarrierwaveを使っているせいで
    >画像の保存にいくまでに他のカラムでエラーになった場合に
    >ImageUploader にならずに ActionDispatch のまま form に戻ってきてしまうのです…



    なお、先の回答「string型にはurlプロパティがありません となります。」は間違ってるかもしれません。(自分がRailsにあまり詳しくないのに推測で書いてしまいました。)

    【メモ】
    その他、色々漁ってみた記事。
    - [CarrierWaveを使って、ユーザー画像を設定する。 - Qiita](https://qiita.com/nekotanku/items/5da43600f35eada64eac)
    - [【Rails】Carrierwaveを用いて画像を複数アップロードする方法 - Qiita](https://qiita.com/matsubishi5/items/a0ff8ab9a830d2cfcc7e)
    - [Rails carrierwave について - Qiita](https://qiita.com/sakakinn/items/27aec9c851af87e21767)
    - [第13章 ユーザーのマイクロポスト - Railsチュートリアル](https://railstutorial.jp/chapters/user_microposts?version=5.1#sec-image_validation)

Your answer might help someone💌