Обезьяна патчи ActiveStorage :: Вложение теряется - PullRequest
9 голосов
/ 11 марта 2019

Поэтому я решил добавить url attr_accessor к объектам ActiveStorage :: Attachment.

В development патч некоторое время удерживается до тех пор, пока, кажется, он "не потерян".Это означает, что это работает в течение нескольких минут, а затем больше не работает.Затем мне нужно перезапустить сервер, чтобы снова применить патч.Я считаю, что я не исправляю исправления правильно, и мне нужны советы в этом вопросе.


Вот что я попробовал:

lib / ext / active_storage / attachment.rb

Первая попытка:

module ActiveStorageUrl
  extend ActiveSupport::Concern

  included do
    attr_accessor :url
  end
end

ActiveStorage::Attachment.send :include, ActiveStorageUrl

Вторая попытка

class ActiveStorage::Attachment < ActiveRecord::Base
  attr_accessor :url
end

И, кстати, в обоих случаях она загружается так:

config / initializers / monkey_patches.rb

require 'ext/active_storage/attachment'

Так что, когда это работает, у меня нет сообщения об ошибке, но через некоторое время патч "не исчезает" (не хватает лучших терминов), и я получаю следующую ошибку, сообщая, что моего attr_accessor больше нет.Rails, должно быть, перезагрузил классы ActiveStorage, и мой патч потерян.

Module::DelegationError in Products#images
url delegated to blob, but blob is nil

Ответы [ 3 ]

4 голосов
/ 17 марта 2019

Я поместил свой ActiveStorage::Attachment MonkeyPatch в / app / models / active_storage /
Я добавил обратный вызов, чтобы получить информацию об изменении вложения.Работает нормально, все время.

Может быть, это проблема.

2 голосов
/ 20 марта 2019

Вы, вероятно, теряете свой патч обезьяны, потому что код перезагружается и ваше ext / active_storage / attachment не требуется повторно.

Вы можете указать Rails запускать обратный вызов при запуске, и каждый раз, когда код перезагружается, как это.

Rails.configuration.to_prepare do
  require 'ext/active_storage/attachment'
end
2 голосов
/ 15 марта 2019

Кажется, имеет отношение к delegate_missing_to, например,

delegate_missing_to :blob

https://github.com/rails/rails/blob/master/activestorage/app/models/active_storage/attachment.rb#L14

Переход к , где он определен :

В любом случае это может быть связано с тем, как работает attr_accessor, я бы попробовал:

def url
  @url
end

def url=(url)
  @url = url
end

Вместо attr_accessor (что на самом деле является функцией C).

В противном случае это действительно оченьХакерский способ решить эту проблему - проверить наличие ActiveStorage::Attachment.instance_methods.include?(:url) и установить обезьяну-патч / включить / предавтеть, когда ее нет.

...