pfaffman
(Jay Pfaffman)
26 أكتوبر 2021، 2:35م
1
تعديل: أعيد تصنيف هذه المشكلة على أنها خطأ، حتى يتمكن شخص يفهمها أفضل مني من الاطلاع عليها.
كانت هناك مجموعة من الملفات المرفقة تحمل الامتداد “unknown”. وهذا يعني أنه من المستحيل إنشاء صور مصغرة. أعتقد أن هذا حدث عند نقل نسخة احتياطية إلى موقع جديد ثم الحاجة إلى إعادة إنشاء الصور المصغرة.
أعتقد أنه عند محاولة إنشاء الصور المصغرة وكان الامتداد ‘unknown’، يجب استبدال الامتداد، شيء مثل:
upload.extension = upload.original_filename.split('.').last
يبدو أنه لو تم ذلك في مكان ما، لما قضيت 4 ساعات في هذا الأمر.
انتظر. يبدو أن هذا هو المشكلة. لماذا يتم إرجاع false بدلاً من الحصول على الامتداد من اسم الملف؟
end
def has_thumbnail?(width, height)
thumbnail(width, height).present?
end
def create_thumbnail!(width, height, opts = nil)
return unless SiteSetting.create_thumbnails?
opts ||= {}
save(validate: false) if get_optimized_image(width, height, opts)
end
# this method attempts to correct old incorrect extensions
def get_optimized_image(width, height, opts = nil)
opts ||= {}
fix_image_extension if (!extension || extension.length == 0)
opts = opts.merge(raise_on_error: true)
begin
تليها التفاصيل الدقيقة.
نقلت الموقع من /community إلى community.example.com عن طريق عمل نسخة احتياطية واستعادتها. أصلحت الملفات المرفقة باستخدام الأمر:
RAILS_ENV=production bundle exec script/discourse remap '/community/uploads' '/uploads'
لكن الصور الرمزية لا تزال تظهر كـ “Gray Man”.
عندما أنظر إلى user.user_avatar.custom_upload.url وألصق هذا الرابط في المتصفح، أحصل على الصورة الرمزية المطلوبة. يبدو أنني بحاجة إلى “إعادة خبز” المستخدمين.
ظننت أن الأمر التالي قد يحل المشكلة:
rake avatars:refresh
أو
rake avatars:clean
لكن دون جدوى.
ما الذي فاتني؟
إعجاب واحد (1)
IAmGav
(Gavin Perch)
26 أكتوبر 2021، 2:41م
2
في Sidekiq، يوجد مشغّل لإنشاء الصور الرمزية المفقودة.
قد يستغرق الأمر بعض الوقت، لكن ذلك يجب أن يساعد إذا لم أكن مخطئًا.
إعجابَين (2)
pfaffman
(Jay Pfaffman)
26 أكتوبر 2021، 2:49م
3
جميل! هذا يستدعي User.refresh_avatar، ولكن للأسف
user=User.find_by_username('broken_avatar_guy')
user.refresh_avatar
أيضًا لا يحل هذه المشكلة.
إعجابَين (2)
pfaffman
(Jay Pfaffman)
27 أكتوبر 2021، 12:30م
4
إليك تلميح:
ActionController::RoutingError (لا توجد مسار يطابق [GET] "/user_avatar/community.example.com/broken_user")
إعجاب واحد (1)
IAmGav
(Gavin Perch)
27 أكتوبر 2021، 12:51م
5
هل يتم التحديث عند تسجيل دخول المستخدم إلى حسابه؟
pfaffman
(Jay Pfaffman)
27 أكتوبر 2021، 12:54م
6
لا أعتقد ذلك.
user.user_avatar.custom_upload يحتوي على الرابط الصحيح، لكن https://community.example.com/user_avatar/community.example.com/bad_user/25/321_2.png يعرض صورة الملف الشخصي المفقودة. أحتاج إلى إيجاد طريقة لإعادة بناء هذه الصور المصغرة للملفات الشخصية.
IAmGav
(Gavin Perch)
27 أكتوبر 2021، 12:56م
7
هناك force_avatar_update في تسجيل دخول المستخدم رأيتها في الكود.
IAmGav
(Gavin Perch)
27 أكتوبر 2021، 1:01م
8
قد يكون هذا مفيدًا للغاية، يبدو وكأنه مهمة
# frozen_string_literal: true
require 'rails_helper'
RSpec.describe Jobs::FixOutOfSyncUserUploadedAvatar do
it 'should fix out of sync user uploaded avatars' do
user_with_custom_upload = Fabricate(:user)
custom_upload1 = Fabricate(:upload, user: user_with_custom_upload)
gravatar_upload1 = Fabricate(:upload, user: user_with_custom_upload)
user_with_custom_upload.update!(uploaded_avatar: custom_upload1)
user_with_custom_upload.user_avatar.update!(
custom_upload: custom_upload1,
gravatar_upload: gravatar_upload1
)
user_out_of_sync = Fabricate(:user)
custom_upload2 = Fabricate(:upload, user: user_out_of_sync)
gravatar_upload2 = Fabricate(:upload, user: user_out_of_sync)
prev_gravatar_upload = Fabricate(:upload, user: user_out_of_sync)
This file has been truncated. show original
pfaffman
(Jay Pfaffman)
27 أكتوبر 2021، 6:25م
9
يبدو أن هناك خطأ:
user=User.find_by_username('Tuomo')
upload_id=user.user_avatar.custom_upload.id
upload = Upload.find(upload_id)
Discourse.avatar_sizes.each do |size|
OptimizedImage.create_for(upload, size, size)
end
OptimizedImage.where(upload_id: upload_id)
وحصلت على عدم وجود صور محسّنة.
broken_uploads = Upload.where(extension: "unknown")
broken_uploads.each do |upload|
upload.extension = upload.original_filename.split('.').last
upload.save
end
يُصلح ذلك.
ثم أحتاج فقط إلى إنشاء صور مصغّرة جديدة، هكذا:
has_upload = UserAvatar.where("custom_upload_id > 0")
has_upload.each do |user_avatar|
Jobs.enqueue(:create_avatar_thumbnails,{upload_id: user_avatar.custom_upload_id})
end
إعجابَين (2)
pfaffman
(Jay Pfaffman)
10 نوفمبر 2021، 8:00م
10
أعتقد أن هذه علة شرعية وأحبها جيف، لكنها لم تحظ بأي اهتمام إضافي.
هل أنا مجنون أم أن هناك شيئًا معطلاً هنا؟
إعجابَين (2)