Рельсы + драгоценный камень Стрекоза:Сохранение изображения в структуре каталогов на основе атрибутов объекта ActiveRecord.
-
01-10-2019 - |
Вопрос
я использую драгоценный камень стрекоза Управлять изображениями и вложениями в моем приложении Rails, и мне нужно хранить изображения в определенной структуре каталога на основе моей пользовательской модели.Давайте скажем, что у меня есть пользовательская модель, у которой есть имя, и у каждого пользователя есть много альбомов, которые также имеют имя, тогда я хочу, чтобы изображения хранялись в "#{RAILS_ROOT}/public/system/#{user.name}/#{user.album.name}/#{suffix}"
Мне удалось изменить root_path в Dragon Fly, и я даже отменил жато -nertavity_storage_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 и т.д.
Если вы хотите это сделать, вам придется пропатчить Attachment#save!любить так:
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 Dragonfly::D ataStorage::FileDataStore#store, чтобы учесть Второй аргумент.
Из интереса, почему вы хотите, чтобы изображения хранились в этом формат?
Аплодисменты Метка