我正在开发 Rails 7 应用程序,我正在尝试实现一个功能,每当上传或更改事件图像时,我都会计算和更新事件图像的主颜色。我正在使用 MiniMagick 处理图像,并且我想将主色存储在事件表中的dominant_color 列中。
我在事件表中创建了一个dominant_color列,并在事件模型中编写了以下代码,以在附加或更改图像时计算和存储主颜色:
# app/models/event.rb
require 'mini_magick'
class Event < ApplicationRecord
# Change to after_commit and use a different detection method
after_commit :check_and_update_dominant_color, on: [:create, :update]
private
def should_update_dominant_color?
image.attached? &&
(saved_change_to_attribute?('image_attachment_id') || image.attachment&.saved_change_to_blob_id?)
end
def update_dominant_color
return unless image.attached?
# Ensure we're working with the actual blob data
image.open do |tempfile|
img = MiniMagick::Image.read(tempfile)
img.resize '1x1'
pixel = img.get_pixels[0][0]
hex_color = rgb_to_hex(pixel)
# Use update_column to avoid callbacks
update_column(:dominant_color, hex_color)
end
end
def rgb_to_hex(rgb_array)
"#" + rgb_array[0..2].map { |c| c.to_s(16).rjust(2, '0') }.join
end
end
我真的很感激任何反馈,特别是来自那些使用过 MiniMagick 或已经实现了类似功能的人的反馈。谢谢!
编辑:在控制台中手动测试颜色提取有效
event = Event.find(3)
event.send(:update_dominant_color)
event.reload.dominant_color
检查为什么这不起作用
def should_update_dominant_color?
image.attached? &&
(saved_change_to_attribute?('image_attachment_id') || image.attachment&.saved_change_to_blob_id?)
end
也许还有其他方法可以检查图像是否已更改。
您可以尝试使用其他回调,例如“before_save”,并检查图像是否已更改并设置一些标志。然后使用“after_commit”和该标志来运行您的逻辑。
总的来说,我认为你的代码应该可以工作,但很难说为什么不可以。您使用什么宝石作为附件?