ayaka-k
@ayaka-k (あやか)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

rails_admin , carrierwaveを使用して、画像表示をさせたい。

解決したいこと

rails_admin , carrierwave を使用した時、
画像表示をさせたい。

rails初学者です。
画像を表示させたいのですが、つまづいてしまいました。。。
宜しくお願い致します。

①「mount_uploaders」画像は表示されないが、rails_adminは正常に動く。

artwork.rb
 mount_uploaders :images, ImageUploader

スクリーンショット 2021-08-29 14.09.21.png

②「mount_uploader」画像は表示されるが、rails_adminにエラーが発生する。

artwork.rb
 mount_uploader :images, ImageUploader

②のときの、エラーメッセージ

TypeError in RailsAdmin::MainController#new
no implicit conversion of nil into String

スクリーンショット 2021-08-29 14.09.02.png

その他コード

artwork.rb
class Artwork < ApplicationRecord
  mount_uploaders :images, ImageUploader
  serialoze :images, JSON
end
artwork.controller.rb
    def artwork_params
      params.require(:artwork).permit(:title, :content, :price, :image, images:[] )
    end
image_uploader.rb
class ImageUploader < CarrierWave::Uploader::Base

  storage :file

  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end
 end
index.html.erb
<div class="artwork_index">
  <div class="row row-cols-1 row-cols-md-3 g-4">
    <% @artworks.each do |artwork| %>
      <div class="col">
        <div class="card">
          <div class="card-body">
            <%= link_to artwork do %>
              <% if artwork.images? %>
                <img src="<%= artwork.images %>" class="index_image" >
              <% else %>
                <%= image_tag '/assets/noimage.png', class:"index_image", height:'100' %>
              <% end %>
            <% end %>
          </div>
        </div>
      </div>
    <% end %>
  </div>
</div>
0

3Answer

エラー以前の部分でですが、

$ rails c

> a = Artwork.find(...) # 対象のレコードを指定
> p a.images
> puts a.images.to_s

こうするとimagesがどういうものか分かると思いますが、<img src="<%= artwork.images %>" class="index_image" >こういうふうにimgタグのsrcに入れて成立するか分かりますか?

それとimage_tagメソッドとhtmlとしてのimgタグの違いは分かりますか?(なぜ片側でimgタグで、もう一方ではimage_tag?)

0Like

Comments

  1. @ayaka-k

    Questioner

    コメントありがとうございます。

    以下のように書き直したのですが、やはり、
    mount_uploaders :images, ImageUploader
    だと、変わらずエラーになってしまいます。。。

    mount_uploader :images, ImageUploader 
    だと表示はされますが、
     mount_uploaders :〜
    の時に画像が表示されるようにしたいです。。。

    <% if artwork.images? %>
     <%= image_tag artwork.images.to_s, class:"index_image" %>
    <% else %>
    <%= image_tag '/assets/noimage.png', class:"index_image" %>
    <% end %>

[0]を入れることで解決することができました!
<%= image_tag artwork.images[0].to_s, class:"index_image" %>

0Like
$ rails c

> artwork = Artwork.find(...)
> p artwork.images.to_s
> p artwork.images.first
> p artwork.images.first.url
> p artwork.images_urls
> p artwork.images_urls.first

こうやって見てそれぞれの違いが分かりますか?

0Like

Your answer might help someone💌