ruby-on-rails - 如何覆盖 rails 模型中的 class_method 问题

标签 ruby-on-rails ruby ruby-on-rails-4 activesupport-concern

如何覆盖模型关注点中定义的类方法?

这有点棘手,因为您并没有真正覆盖类方法,对吧?因为它使用了在 class_methods block 中定义类方法的关注 api。

所以说我有一个看起来像这样的问题:

module MyConcern
  extend ActiveSupport::Concern

  class_methods do
    def do_something
       #some code
    end
  end

end

在模型中.. 我如何重写该方法,以便在使用继承时可以像调用 super 一样调用它?所以在我的模型中我想去:

def self.do_something
  #call module do_something
end

?

最佳答案

如果您在定义self.do_something 的模型中included MyConcern,您应该能够使用 super :

module MyConcern
  extend ActiveSupport::Concern

  class_methods do
    def do_something
      puts "I'm do_something in the concern"
    end
  end
end

class UsesMyConcern < ActiveRecord::Base
  include MyConcern

  def self.do_something
    super
  end
end

UsesMyConcern.do_something
# => "I'm do_something in the concern"

如果您没有或不想在模型中include MyConcern,并且想在模块上调用do_something 而不创建任何中间对象,您可以将您的模型更改为:

class UsesMyConcern < ActiveRecord::Base
  def self.do_something                
    MyConcern::ClassMethods.instance_method(:do_something).bind(self).call
  end
end

UsesMyConcern.do_something
# => "I'm do_something in the concern"

ActiveSupport::Concern.class_methods如果还没有,则在关注点中定义一个 ClassMethods 模块,这是我们可以找到 do_something 方法的地方。

关于ruby-on-rails - 如何覆盖 rails 模型中的 class_method 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38506173/

相关文章:

ruby-on-rails - rails 3.1.0 的 Heroku 错误

javascript - 将 fineuploader 与 react-rails 一起使用

ruby-on-rails - rails : respond_to JSON and HTML

ruby-on-rails - 从Rails模型动态创建ical/ics文件

ruby-on-rails - 跨多个文件打破 ruby​​ 模块

ruby-on-rails - 如何在 active_model_serializers 中执行预先加载

ruby-on-rails - Rails CSV 导入格式奇怪

ruby - 如何使用礼物?在 Ruby 项目中?

ruby-on-rails-4 - 使用Minitest的测试助手方法

ruby-on-rails - rails 中 get 和 match 的区别