В настоящее время я выполняю миграцию из Paperclip в Active Storage с использованием этого учебного пособия, а также ссылаюсь на официальное руководство .
.1007 * миграция моих активов .
Это содержимое моего lib/tasks/migrate_paperclip_assets.rake
файла:
desc 'Generates file names on AWS S3 and places them in their proper structure'
namespace :posts do
task migrate_to_active_storage: :environment do
Post.where.not(image_file_name: nil).find_each do |post|
img_filename = post.image_file_name
ext = File.extname(img_filename)
image_url =
"https://#{Rails.application.credentials.dig(:aws,
:bucket_name)}/#{Rails.application.credentials.dig(:aws,
:host_name)}/posts/images/000/000/#{post.id}/original/#{img_filename}"
puts image_url
post.image.attach(io: open(image_url),
filename: post.image_file_name,
content_type: post.image_content_type)
end
end
end
Когда я запускаю это, я получаю следующую ошибку:
rake aborted!
NoMethodError: undefined method `attach' for #<Paperclip::Attachment:0x00000003170090>
[...]
В руководстве по миграции на Rails четко указано, что этот метод следует использовать, прикрепив здесь в том же формате, что и я, - не уверен, почему это издает ошибку.Я точно знаю, что URL работает, и я успешно попытался загрузить изображения.
Вот некоторые вещи, которые я пробовал, которые не работали:
- Попытка это приняторешение .
- Ближайшая вещь для прикрепления, которую я видел из документов , была
assign
метод.Но не было никаких обработчиков для работы с файлом изображения. - Я также попытался загрузить файлы в тот же каталог и загрузить их, используя тот же
post.image.attach
.
Даже если Класс вложений Paperclip сам по себе не имеет определенного метода attach
, на GitHub имеется большое количество репозиториев с кодом, имеющим сходный формат: user.avatar.attach(io: open(avatar_url), filename: user.avatar_file_name)
.
Это содержимоемоего app/models/post.rb
файла:
class Post < ApplicationRecord
belongs_to :user
has_many :comments, dependent: :destroy
has_many :likes, dependent: :destroy
has_many :dislikes, dependent: :destroy
attr_accessor :uploaded_image_for_io_adapters, :file_name, :top_text, :bot_text
has_attached_file :image
validates_attachment_content_type :image, content_type: /\Aimage\/.*\z/
validates_attachment :image, presence: true
validates_presence_of :poster
validates_presence_of :description
validates :user, presence: true
validates :user_id, presence: true
end
Потерянный и сбитый с толку, если вы могли бы предложить альтернативу обходу необходимости использования этого attach
метода или дать мне подсказки относительно того, что я могу делатьнеправильно, что было бы здорово.
Для контекста, версия Ruby: 2.4.1, Rails: 5.2.1