Paperclip :: Attachment - неопределенный метод `attach '.Задача рейка миграции активов - PullRequest
0 голосов
/ 29 декабря 2018

В настоящее время я выполняю миграцию из 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 работает, и я успешно попытался загрузить изображения.

Вот некоторые вещи, которые я пробовал, которые не работали:

  1. Попытка это приняторешение .
  2. Ближайшая вещь для прикрепления, которую я видел из документов , была assign метод.Но не было никаких обработчиков для работы с файлом изображения.
  3. Я также попытался загрузить файлы в тот же каталог и загрузить их, используя тот же 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

1 Ответ

0 голосов
/ 29 декабря 2018

Я думаю, что решение находится в документации, которой вы поделились .

class Organization < ApplicationRecord
  # New ActiveStorage declaration
  has_one_attached :logo

  # Old Paperclip config
  # must be removed BEFORE to running the rake task so that
  # all of the new ActiveStorage goodness can be used when
  # calling organization.logo
  has_attached_file :logo,
                    path: "/organizations/:id/:basename_:style.:extension",
                    default_url: "https://s3.amazonaws.com/xxxxx/organizations/missing_:style.jpg",
                    default_style: :normal,
                    styles: { thumb: "64x64#", normal: "400x400>" },
                    convert_options: { thumb: "-quality 100 -strip", normal: "-quality 75 -strip" }
end

Похоже, has_attached_file должен быть заменен на has_one_attached.

В противном случае image будет использовать Paperclip вместо ActiveStorage (который имеет метод attach).

...