Ваше решение использовать File.open
будет работать, но вы должны убедиться, что имя действительно с File.basename
поэтому кто-то не мог пройти мимо ../../secret_credentials.yml
и выставлять информацию, которую вы не хотите. Также неплохо было бы проверить его на список предустановленных изображений.
Однако вы можете сделать это более эффективно, пропустив CarrierWave в этом случае.
Добавить новое поле под названием library_image
, когда кто-то хочет использовать предустановленное изображение, тогда вы устанавливаете library_image
, если они хотят использовать свою собственную фотографию, unset library_image
и загрузить фотографию как обычно. Затем добавить вспомогательный метод, как:
def avatar_url
if self.library_image?
"http://example.com/images/#{self.library_image}"
else
self.picture.url
end
end
Это предполагает, что вы можете найти предустановленные изображения в http://example.com/images/[name]
и вы используете mount_uploader
в CarrierWave имени picture
.
Теперь, когда вы хотите отобразить их фотографию, вы должны позвонить avatar_url
, который будет проверять, должен ли он возвращать заданный URL-адрес или загруженное изображение.
Примера того, как вы обновите library_image
или picture
на основе оригинального вопроса:
if params[:file].is_a?(Hash)
model.library_image = params[:file][:url]
model.remove_picture = true
else
model.library_image = nil
model.picture = params[:file]
end
Как я могу обнаружить, что пользователь загружает новую картину? Я имею в виду, каково имя функции обратного вызова, которое я должен написать, чтобы сбросить библиотеку? Спасибо! – CamelCamelCamel
@CamelCamelCamel Я обновил свой первоначальный ответ на примере. –
Как вернуть файл как пресет или файл в зависимости от аватара_url? – CamelCamelCamel