【问题标题】:How to monkey patch in Ruby on Rails如何在 Ruby on Rails 中进行猴子补丁
【发布时间】:2019-08-06 10:14:07
【问题描述】:

我想向ActiveStorage::Blob 添加一个方法。我有这个:

config/initializers/active_storage_cached_urls.rb

module ActiveStorageBlobCachedUrl
  def direct_url
    xxx || self.service_url
  end
end

config/environment.rb 结束

ActiveStorage::Blob.include ActiveStorageBlobCachedUrl

我在开发中启动了rails s,它可以工作。然后我更新了一个ruby文件,比如模型,报错:undefined method 'direct_url...

我猜有些东西是在没有我的猴子补丁的情况下重新加载的。为了让我的猴子补丁也重新加载,我缺少什么?

【问题讨论】:

  • 你不会错过任何东西。 Rails 检测到它应该重新加载 ActiveStorage::Blob 并重新加载它。它不知道是否应该重新加载其他内容。
  • 谢谢,我添加这个是为了更准确地回答我的问题:“为了让我的 Monkey Patch 也重新加载,我缺少什么?”
  • 您应该在重新加载后手动应用它。定义一个控制台命令来执行reload! && ActiveStorage::Blob.include(ActiveStorageBlobCachedUrl)并调用它而不是reload!
  • 我什至都不叫reload!我有我的 rails s,它正在工作,当我更新 user.rb 时,没有重新启动我的 rails s,然后当我重新加载页面时它会失败。我不知道我应该把ActiveStorage::Blob.include ActiveStorageBlobCachedUrl 放在哪里才能让它与这个自动重新加载的东西一起工作。我想我不应该把它放在 environment.rb 中。
  • AFAIK,没有办法教 Rails 在重新加载它认为重新加载的内容时重新加载一些其他内容。

标签: ruby-on-rails monkeypatching


【解决方案1】:

这不是最佳解决方案,但是当我将代码放在 environment.rblib/.rb 或 config/initializers/.rb,然后我有错误。

如果我把它放在一个模型文件中,那么它就可以工作。

app/models/random_model.rb

ActiveStorage::Blob.include ActiveStorageBlobCachedUrl
ActiveStorage::Variant.include ActiveStorageVariantCachedUrl

class RandomModel < ApplicationRecord
  xxx
end

【讨论】:

    【解决方案2】:

    把这个放在initializers/的文件中

    module ActiveStorageBlobCachedUrl
      def direct_url
        # xx
      end
    end
    
    
    ActiveSupport::Reloader.to_prepare do
      ActiveStorage::Blob.include ActiveStorageBlobCachedUrl
    end
    

    【讨论】:

      猜你喜欢
      • 2011-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-26
      • 2015-09-26
      • 2011-10-06
      • 2020-05-24
      相关资源
      最近更新 更多