【问题标题】:Rails customize class GemRails 自定义类 Gem
【发布时间】:2016-02-08 17:24:13
【问题描述】:

我在我的 rails 应用程序中重新打开了一个 gem 类,一切似乎都很好,一切运行良好,但几分钟后,我的应用程序似乎忘记了所有修改:

config/initializers/rapidfire_custom.rb

::Rapidfire::Survey.class_eval do

  belongs_to :campaign, class_name: '::Campaign', inverse_of: :survey

  before_create :default_active
  before_validation :default_status, :default_name

  STATUS = ['DRAFT', 'PUBLISHED']
  validates_inclusion_of :status, in: STATUS
  validates :name, presence: true

  scope :from_company, -> (id) { where(company_id: id) }
  scope :template, -> { where(campaign_id: nil) }
  scope :published, -> { where(status: 'PUBLISHED') }

  def default_active
    self.active ||= true
  end

  def default_status
    self.status ||= 'DRAFT'
  end

  def self.all_status
    STATUS
  end

  def default_name
    if self.campaign
      self.name = 'Survey'
    end
  end

end

错误:

undefined method `template' for #<Rapidfire::Survey::ActiveRecord_AssociationRelation:0x007fc762215ad0>

它只发生在开发中,我使用的是 puma:

config/puma.rb

workers Integer(ENV['WEB_CONCURRENCY'] || 2)
threads_count = Integer(ENV['MAX_THREADS'] || 5)
threads threads_count, threads_count

preload_app!

rackup      DefaultRackup
port        ENV['PORT']     || 3000
environment ENV['RACK_ENV'] || 'development'

if ENV['RACK_ENV'].nil? || ENV['RACK_ENV'] == 'development'
  ssl_bind 'my_website.dev', '3000', { key: 'ssl/device.key', cert: 'ssl/device.crt' }
end

on_worker_boot do
  ActiveRecord::Base.establish_connection
  $redis.client.reconnect
end

我不知道发生了什么,有什么想法吗?

谢谢

【问题讨论】:

  • 有什么原因你在猴子修补类而不只是子类化它?
  • 我按照您的建议使用了继承,并且效果很好。但我仍然不明白为什么这不适用于我之前的猴子补丁

标签: ruby-on-rails ruby metaprogramming


【解决方案1】:

我猜当 ActiveRecord 实例化 Rapidfire::Survey 记录时,它会从 gem 加载类 - 这会使您在初始化程序中对类 eval 所做的更改无效。

不属于你的猴子修补对象只有在你需要重写库方法并且没有更好的方法时才应该真正完成。

您还需要考虑类评估发生的时间和地点 - 初始化程序在 Rails 应用程序加载时运行,而模型类在 ActiveRecord 需要它们时延迟加载。所以使用初始化器来配置模型并不是一个好主意。

在这里使用继承是正确的做法 - 您正在创建自己的域对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    相关资源
    最近更新 更多