はじめに
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をつけてあげると、ちゃんと動きました。
すごい凡ミスですが、単数の画像アップロードから複数の画像アップロードに変える際には皆さんもお気をつけてください…