LoginSignup
9
5

More than 3 years have passed since last update.

Carrierwave × rails_adminで画像を複数アップロードするときにハマった話

Last updated at Posted at 2019-06-11

はじめに

Shopテーブルにimageカラムを持たせ、お店の画像をアップロードするためにCarrierwaveを使っていた。しかし、Shopに複数の画像を設定するように変更したかったため、Carrierwaveのドキュメントに従って、 imageカラムをimagesカラムに変更し、一つのカラムの中に複数画像をアップロードする実装をすることになった。
一通り実装を終えてrails_adminの管理画面からShopのデータを作成しようとしたらエラーが出てハマったので、同じ境遇になった方のために記事にしておきます。
※この記事は、Carrierwaveで画像アップロードを既に実装していて、かつrails_adminで管理画面を使っている方が主に対象になるかと思います。

まずはCariierwaveのドキュメント通り実装する

ドキュメントを読んでいただければわかるのですが、Carrierwaveで複数画像をアップロードするための設定は非常に簡単です。
まず、imagesカラムを対象のテーブルに追加します。(私の場合はShopテーブル)

rails g migration add_images_to_shops images:json
rails db:migrate

※このコマンドはドキュメントに乗っ取っているので、新しくカラムを作るのか、既にあるimageカラムをimagesカラムに変えるのかによって多少変わります。要するにjson型のimagesカラムが作れればおけです

続いてShopモデルを編集します

class Shop < ActiveRecord::Base
  mount_uploader :images, ImageUploader
end

そして、これに加えてrails_adminのcarrierwave用の設定もします。ドキュメント参照

class Shop < ActiveRecord::Base
  mount_uploader :images, AvatarUploader
  attr_accessor :delete_images
  after_validation do
    uploaders = images.delete_if do |uploader|
      if Array(delete_images).include?(uploader.file.identifier)
        uploader.remove!
        true
      end
    end
    write_attribute(:images, uploaders.map { |uploader| uploader.file.identifier })
  end

  def images=(files)
    appended = files.map do |file|
      uploader = _mounter(:images).blank_uploader
      uploader.cache! file
      uploader
    end
    super(images + appended)
  end
end

これで全ての準備が整った、、、はずなのですが、、、

rails_adminのShopの新規作成画面に行くと、以下のようなエラーが出てしまいます。

Showing /app/vendor/bundle/ruby/2.6.0/gems/rails_admin-1.4.2/app/views/rails_admin/main/_form_multiple_file_upload.html.haml where line #9 raised:

ActionView::Template::Error (undefined method `identifier' for nil:NilClass):
     6:         %i.icon-white.icon-trash
     7:         = I18n.t('admin.actions.delete.menu').capitalize + " #{field.label.downcase} ##{i + 1}"
     8: 
     9:     = form.check_box(field.delete_method, {multiple:true, style: 'display:none;'}, attachment.delete_key, nil)
    10: 
    11: = form.file_field(field.name, field.html_attributes.reverse_merge({ data: { :"multiple-fileupload" => true }, multiple: true }))
    12: 

rails_adminのgemのなかで何やらエラーが起こっている…だけどgemの中をひたすら追いかけ回っても原因がさっぱりわからず、1日もこのエラーに悩まされてしまいました。

しかし、ドキュメントと自分のコードを睨み続けた結果、あることに気づいたのです…

自分のコード

class Shop < ActiveRecord::Base
  mount_uploader :images, ImageUploader
end

ドキュメントのコード

class Shop < ActiveRecord::Base
  mount_uploaders :images, ImageUploader
end

mount_uploader「s」…

mount_uploaderに「s」が付いてない!!!!\(^o^)/

ただsをつけ忘れてただけでした…sをつけてあげると、ちゃんと動きました。

すごい凡ミスですが、単数の画像アップロードから複数の画像アップロードに変える際には皆さんもお気をつけてください…

9
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
5