diff --git a/lib/rails_admin/config/fields/types/active_storage.rb b/lib/rails_admin/config/fields/types/active_storage.rb index 3dafb4c6ea..d0ce0966c2 100644 --- a/lib/rails_admin/config/fields/types/active_storage.rb +++ b/lib/rails_admin/config/fields/types/active_storage.rb @@ -17,7 +17,8 @@ class ActiveStorage < RailsAdmin::Config::Fields::Types::FileUpload register_instance_option :image? do if value - value.filename.to_s.split('.').last =~ /jpg|jpeg|png|gif|svg/i + mime_type = Mime::Type.lookup_by_extension(value.filename.extension_without_delimiter) + mime_type.to_s.match?(/^image/) end end diff --git a/lib/rails_admin/config/fields/types/dragonfly.rb b/lib/rails_admin/config/fields/types/dragonfly.rb index e324b40dcf..9ff23da100 100644 --- a/lib/rails_admin/config/fields/types/dragonfly.rb +++ b/lib/rails_admin/config/fields/types/dragonfly.rb @@ -12,7 +12,8 @@ class Dragonfly < RailsAdmin::Config::Fields::Types::FileUpload register_instance_option :image? do false unless value if abstract_model.model.new.respond_to?("#{name}_name") - bindings[:object].send("#{name}_name").to_s.split('.').last =~ /jpg|jpeg|png|gif/i + mime_type = Mime::Type.lookup_by_extension(bindings[:object].send("#{name}_name").to_s.split('.').last) + mime_type.to_s.match?(/^image/) else true # Dragonfly really is image oriented end diff --git a/lib/rails_admin/config/fields/types/file_upload.rb b/lib/rails_admin/config/fields/types/file_upload.rb index 2c8947442d..e955185ee6 100644 --- a/lib/rails_admin/config/fields/types/file_upload.rb +++ b/lib/rails_admin/config/fields/types/file_upload.rb @@ -50,7 +50,8 @@ class FileUpload < RailsAdmin::Config::Fields::Base end register_instance_option :image? do - (url = resource_url.to_s) && url.split('.').last =~ /jpg|jpeg|png|gif|svg/i + mime_type = Mime::Type.lookup_by_extension(resource_url.to_s.split('.').last) + mime_type.to_s.match?(/^image/) end register_instance_option :allowed_methods do diff --git a/lib/rails_admin/config/fields/types/multiple_active_storage.rb b/lib/rails_admin/config/fields/types/multiple_active_storage.rb index 9cc59caa6b..d049d2868f 100644 --- a/lib/rails_admin/config/fields/types/multiple_active_storage.rb +++ b/lib/rails_admin/config/fields/types/multiple_active_storage.rb @@ -18,7 +18,8 @@ class ActiveStorageAttachment < RailsAdmin::Config::Fields::Types::MultipleFileU register_instance_option :image? do if value - value.filename.to_s.split('.').last =~ /jpg|jpeg|png|gif|svg/i + mime_type = Mime::Type.lookup_by_extension(value.filename.extension_without_delimiter) + mime_type.to_s.match?(/^image/) end end diff --git a/lib/rails_admin/config/fields/types/multiple_file_upload.rb b/lib/rails_admin/config/fields/types/multiple_file_upload.rb index 5bfb586a1c..b6f734038a 100644 --- a/lib/rails_admin/config/fields/types/multiple_file_upload.rb +++ b/lib/rails_admin/config/fields/types/multiple_file_upload.rb @@ -45,7 +45,8 @@ def initialize(value) end register_instance_option :image? do - (url = resource_url.to_s) && url.split('.').last =~ /jpg|jpeg|png|gif|svg/i + mime_type = Mime::Type.lookup_by_extension(resource_url.to_s.split('.').last) + mime_type.to_s.match?(/^image/) end def resource_url(_thumb = false) diff --git a/spec/rails_admin/config/fields/types/active_storage_spec.rb b/spec/rails_admin/config/fields/types/active_storage_spec.rb index 391d204235..47ff5feff9 100644 --- a/spec/rails_admin/config/fields/types/active_storage_spec.rb +++ b/spec/rails_admin/config/fields/types/active_storage_spec.rb @@ -17,11 +17,18 @@ end describe '#image?' do - context 'when attachment is an image' do - let(:record) { FactoryBot.create :field_test, active_storage_asset: {io: StringIO.new('dummy'), filename: "test.jpg", content_type: "image/jpeg"} } - - it 'returns true' do - expect(field.image?).to be_truthy + context 'configured Mime::Types' do + before { Mime::Type.register 'image/webp', :webp } + after { Mime::Type.unregister :webp } + + %w[jpg jpeg png gif svg webp].each do |image_type_ext| + context "when attachment is a '#{image_type_ext}' file" do + let(:record) { FactoryBot.create :field_test, active_storage_asset: {io: StringIO.new('dummy'), filename: "test.#{image_type_ext}"} } + + it 'returns true' do + expect(field.image?).to be_truthy + end + end end end