Rails + Dragonfly Gem: حفظ الصورة في بنية الدليل على أساس سمات كائن ActivereCord
-
01-10-2019 - |
سؤال
أنا استخدم الجوهرة اليعسوب لإدارة الصور والمرفقات في تطبيق Rails الخاص بي وأحتاج إلى تخزين الصور في بنية دليل محددة استنادًا إلى نموذج المستخدم الخاص بي. دعنا نقول أن لدي نموذج مستخدم له اسم ويحتوي كل مستخدم على العديد من الألبومات ، التي لها اسم أيضًا ، ثم أريد تخزين الصور فيها "#{RAILS_ROOT}/public/system/#{user.name}/#{user.album.name}/#{suffix}"
لقد تمكنت من تغيير Root_path في Fly Dragon ، وقد تجاوزت REPANTING_STOROGE_PATH مثل هذا:
class MyDataStore < Dragonfly::DataStorage::FileDataStore
private
def relative_storage_path(suffix)
"#{suffix}"
end
end
لكن لا يزال ، لا أعرف كيف يمكنني تمرير سمات كائن ActivereCord مثل user.name
و user.album.name
إلى relative_storage_path
لإنشاء طريقي المثالي.
هل لديك أي فكرة كيف يمكنني القيام مثل هذا الشيء؟
المحلول
مارك إيفانز مؤلف جوهرة قدم لي معروفا وأجاب على هذا السؤال على مجموعة Google. إليكم إجابته التي نجحت بشكل جيد في حالتي:
أهلاً
لا يمكنك القيام بذلك خارج المربع ، لأن متجر البيانات مصمم عن قصد ليكون بسيطًا للغاية - فأنت تمر في البيانات ، فهو يعيدك إلى uid ، إلخ.
إذا كنت ترغب في القيام بذلك ، فسيتعين عليك مرفق القرد#حفظ! مثل ذلك:
class Dragonfly::ActiveRecordExtensions::Attachment
def save!
destroy! if uid_changed?
self.uid = app.datastore.store(temp_object, parent_model) if has_data_to_store?
end
end
الشيء الوحيد الذي قمت بتغييره أعلاه هو أن DataStore.store يأخذ اثنين من args الآن.
سيكون عليك بعد ذلك تعديل/Monkey-Patch-Patch Dragonfly :: DataStorage :: FileDatastore#Store لأخذ في الاعتبار ARG الثاني.
بدافع الاهتمام ، لماذا تريد تخزين الصور بهذا التنسيق؟
هتاف مارك