首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >覆盖ActiveSupport::Overriding模块中的方法,该模块由同一模块中的类方法定义

覆盖ActiveSupport::Overriding模块中的方法,该模块由同一模块中的类方法定义
EN

Stack Overflow用户
提问于 2015-01-29 12:32:49
回答 1查看 3K关注 0票数 10

我有一个ActiveSupport::关注点模块,大致如下所示:

代码语言:javascript
复制
module MyModel
  module Acceptance

    extend ActiveSupport::Concern

    included do
      enum status: [:declined, :accepted]
    end

    def declined!
      self.status = :declined
      # some extra logic
      self.save!
    end

    def accepted!
      self.status = :accepted
      # some extra logic
      self.save!
    end
  end
end

这将只包含在ActiveRecord类中,因此使用了enum。基本上,我正在用自己的一些额外的自定义逻辑覆盖由declined!创建的ActiveRecord::Enum.enumaccepted!方法。

问题是,这不起作用,因为当我调用@model.declined!时,它只是调用declined!的原始实现,而忽略了我的自定义方法。

看起来,在运行包含的块之前,我的自定义方法被包含在调用类中--这意味着我的自定义方法正在被enum定义的方法覆盖,而不是反过来。

在这种特殊情况下,有一些简单的解决办法(例如,我可以将调用enum移回包含类,并确保它高于include MyModel::Acceptance,但我想知道是否有一种方法可以解决这个问题,同时将其保持在同一个模块中。

有什么方法可以在included中调用类方法来定义实例方法,然后从同一个Concern模块中重写该实例方法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-27 00:44:13

我想你是在找define_method

代码语言:javascript
复制
module MyModel
  module Acceptance

    extend ActiveSupport::Concern

    included do
      enum status: [:declined, :accepted]

      define_method :declined! do
        self.status = :declined
        # some extra logic
        self.save!
      end

      define_method :accepted! do
        self.status = :accepted
        # some extra logic
        self.save!
      end

    end
  end
end
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28214874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档