重写 ActiveSupport::Concern 模块中由同一模块中的类方法定义的方法

2023-11-26

我有一个 ActiveSupport::Concern 模块,大致如下所示:

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! and accepted!由创建的方法ActiveRecord::Enum.enum还有一些我自己的额外的自定义逻辑。

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

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

在这种特殊情况下有一些简单的解决方法(例如,我可以将呼叫移至enum回到包含类并确保它在线上方include MyModel::Acceptance,但我想知道是否有一种方法可以解决这个问题,同时将其全部保留在同一个模块中。

有什么方法可以调用其中的类方法included定义一个实例方法,然后从同一个实例中覆盖该实例方法Concern module?


我想你正在寻找define_method.

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重写 ActiveSupport::Concern 模块中由同一模块中的类方法定义的方法 的相关文章

随机推荐

  • html 表 colspan 未按预期工作

    HTML 概念有时是如此糟糕 这是我在 html 表中使用 colspan 的代码 看起来并不像我预期的那样 table border 1 tr td a td tr tr td b td td c td tr table 我想要的是 ce
  • VBA 宏运行时错误 6:循环内编码溢出

    遇到此错误的问题 我正在创建一个 GA 循环是将我的适应度值分配给一个数组 一些变量 Dim Chromolength as integer Chromolength varchromolength aVariables Dim i as
  • OpenGL帧缓冲区:可以清除它,但不能绘制它

    在 Mac 上 我有一个 OpenGL 设置 除了帧缓冲区外 它工作得很好 纹理工作等 所以我知道纹理已启用 我有一个有效的上下文 等等 所有工作都完美无缺 直到我尝试创建一个帧缓冲区 我使用 glGenFramebuffers glBin
  • GWT 2.0 的硒测试

    如何使 selenium click 的工作方式与手动鼠标单击相同 我最近将 GWT 从 1 7 1 升级到 2 0 一些 selenium 测试 SeleniumRC v1 0 1 IE7 现在失败 看来 Selenium click 方
  • 泛型方法可以使用逆变/协变类型吗?

    我正在编写一个通用方法 以在 T4 模板的特殊任务中使用它 该方法应该允许我使用通用接口中的专用类型 我考虑了以下签名 interface IGreatInterface Object aMethodAlpha u U parameter
  • WPF 用户控件父级

    我有一个用户控件 我将其加载到MainWindow在运行时 我无法从包含窗口获取句柄UserControl 我努力了this Parent 但它始终为空 有谁知道如何从 WPF 中的用户控件获取包含窗口的句柄 以下是控件的加载方式 priv
  • 递归和记忆

    我有一个程序 通过递归传递大量数据 比如 1000 个变量 递归至少会运行 50 或 60 次 我担心的是 由于空间不足 数据是否有可能被覆盖在内存位置上 或者如果没有内存 我会得到一些异常 即程序内存已经用完了 我没有收到这样的错误 是否
  • 将对象数组从js传递到rails

    我正在尝试将对象数组从 js 传递到 Rails data test test asdas ajax url evaluate json data data success function data dataType json Rails
  • 错误:mscorlib.dll 中发生“System.UnauthorizedAccessException”类型的未处理异常

    这是当我尝试将文件复制到某个位置时崩溃并给出此错误的部分 string startupDirectory C Users Tyler AppData Roaming Microsoft Windows Start Menu Programs
  • Eclipse 标记出现次数并不标记所有出现次数

    刚刚安装了 Eclipse Juno Release 构建 ID 20120614 1722 我打开了 标记出现次数 我可以看到它确实标记了我正在编辑的 JS 文件中的一些出现次数 但是 有一个函数调用没有标记 var trackView
  • 使用python设置固定长度

    我的 str 类似于 60 或 100 我需要 str 为 00060 和 00100 我怎样才能做到这一点 代码是这样的 我使用 0 0 0 作为插头 现在需要修复 d 0006000100 a4 60 a5 100 d 0 0 0 a4
  • 情感分析 - wordNet , SentiWordNet 词典

    我需要一个包含积极和消极词语的列表weights根据单词的强度和周数来分配单词 我有 1 WordNet 它为每个单词给出 或 分数 2 SentiWordNet 给出 0 1 范围内的正值和负值 我用几句话检查了这些 love wordN
  • 哪些文件可能包含 OS X 终端的 PATH 声明?

    所以我在 OS X Leopard 上遇到了路径问题 看来 OS X 正在添加我没有说明的其他路径 并且它扰乱了我的路径优先级 我只有一个 bash login文件 我没有 bashrc或 profile 文件 我的 bash login文
  • 如何在 Ruby On Rails 中重定向到上一页?

    我有一个页面列出了所有具有可排序标题和分页的项目 path projects order asc page 3 sort code 我选择编辑其中一个项目 path projects 436 edit 当我单击该页面上的 保存 时 它会调用
  • 在 WiX 中使用防火墙扩展

    我正在尝试编写一个使用 WiX 防火墙扩展的 WiX 脚本 但它似乎找不到扩展 dll 我认为 我看到的错误是这样的 File 元素包含未处理的扩展元素 fire FirewallException 请确保 http schemas mic
  • 使用 ggplot 将图例中的所有图层包含在图例中

    我怎样才能制作一个代表我的图表中绘制的所有曲线的图例 目前 为第一层生成自动图例 基于 颜色 美学 但另一层 表示所有观察中 价格 变量的密度的黑色曲线 不包含在该图例中 我认为我的问题肯定来自对 ggplot 包背后的概念的不完整理解 g
  • 跳过 R 中的特定行和列

    我使用以下命令跳过了第二行数据 Df read csv IMDB data csv header T sep 2 这背后的解释是什么 它可以用于跳过 1 个以上的特定行吗 它可以用于跳过列吗 请帮忙 您可以使用负值 跳过 尽可能多的行 即
  • 在 Twitter Bootstrap 上切换复选框

    我用 Twitter Bootstrap 制作了一组复选框 现在我想做一个 全选 或 取消全选 按钮 我如何使用 JS 函数来做到这一点 Twitter Bootstrap 文档说使用 button toggle 但它不起作用 这是我的代码
  • 使用反向引用不可能实现向后查找

    据我了解 test Result x AAAA A y BBB B z 谁能为这种行为提供合理的解释 Update 这种行为似乎是一个限制 in the re模块 另一种选择regex模块似乎正确处理断言中的组 import regex t
  • 重写 ActiveSupport::Concern 模块中由同一模块中的类方法定义的方法

    我有一个 ActiveSupport Concern 模块 大致如下所示 module MyModel module Acceptance extend ActiveSupport Concern included do enum stat