【发布时间】:2023-04-02 19:08:01
【问题描述】:
我希望我的 gem 为我的 AR 类添加一个方法,以启用某些功能:
class User < ApplicationRecord
enable_my_uber_features :blah
end
为此,在 my_uber_gem/lib/uber_gem.rb 中,我尝试以下操作:
# my_uber_gem/lib/uber_gem.rb
require "active_support"
# ...
require "uber/extensions"
# ...
ActiveSupport.on_load(:active_record) do
class ActiveRecord::Base
include Uber::Extensions
end
end
在 uber/extensions.rb 我有:
# my_uber_gem/lib/uber/extensions.rb
require 'active_support/concern'
module Uber
module Extensions
extend ActiveSupport::Concern
instance_methods do
def foo
p :bar
end
end
class_methods do
def enable_my_uber_features(value)
p value
end
end
end
end
现在我希望在实例化用户时在控制台中看到一个废话,但是我收到一个错误:
[...] `method_missing': undefined method `enable_my_uber_features' for User:Class (NoMethodError)
我尝试将 Uber::Extensions 包含到 ApplicationRecord 而不是 ActiveRecord::Base 中,但没有成功。
我也尝试过扩展Uber::Extensions,没有运气。
我也尝试在 Uber::Extensions 中定义一个 module ClassMethods 扩展/包含,仍然没有运气。
我也按照这个人的指导信了:https://waynechu.cc/posts/405-how-to-extend-activerecord,仍然没有运气。
我做错了吗?
【问题讨论】:
-
你使用的是什么 ruby on rails 版本?
-
你是如何安装这个 gem 的?你确定这个文件正在加载吗?
-
如果
ApplicationRecord可以做同样的事情,为什么还要扩展ActiveRecord::Base? -
您希望
enable_my_uber_features成为类方法还是实例方法?您将其作为 User 类中的类方法调用,但您将其定义为实例方法。 -
我从来没有真正明白为什么 gems 不能让你明确地包含它们而不是猴子修补它们进入系统的方式。您只是为最终用户节省了一行代码。
标签: ruby-on-rails ruby activesupport activesupport-concern