method_missing 覆盖不起作用

2023-12-12

我编写了一个方便的 ActiveRecord 扩展来将方法委托给基础对象(基于多表继承)



class ActiveRecord::Base
  def self.acts_as(base)
    class_eval %Q{
      def method_missing(method, *args, &blk;)
        #{base}.send(method, *args, &blk;)
      rescue NoMethodError
        super
      end
    }
  end
end
  

我有一个state类和一个base



# state class
class MyState < ActiveRecord::Base
  belongs_to :my_object
  acts_as :my_object
end

# base class
class MyObject < ActiveRecord::Base
  has_one :head, :class_name => 'MyState'
  has_one :tail, :class_name => 'MyState'
end
  

当我尝试这个方法时,我发现它在某些情况下不起作用。进一步来说,



> MyState.first.some_method_in_base
nil
> MyObject.first.tail.some_method_in_base
NoMethodError: undefined method `some_method_in_base' for #<ActiveRecord::Associations::HasOneAssociation:0xABCDEFG>
  

谁能告诉我为什么一个有效而另一个无效?


当你跑步时MyObject.first.tail实际响应的对象是关联代理

删除了大部分基本实例方法,并委托 # 通过未知方法@target 方法缺失

您可以获得有关代理运行的更多详细信息:

MyObject.first.proxy_owner
MyObject.first.proxy_reflection
MyObject.first.proxy_target

如果您查看代码,您可以看到 AssociationProxy 将方法 some_method_in_base 代理到您的 MyState 类only if MyState回应库中的某些方法正如您在下面的代码中看到的。

  private
    # Forwards any missing method call to the \target.
    def method_missing(method, *args, &block)
      if load_target
        if @target.respond_to?(method)
          @target.send(method, *args, &block)
        else
          super
        end
      end
    end

因此,方法缺失你已经定义在目标类别从未被调用过。

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

method_missing 覆盖不起作用 的相关文章

  • 匹配一对未转义的平衡分隔符

    如何匹配一对不被反斜杠转义的平衡分隔符 本身不被反斜杠转义 无需考虑嵌套 例如 对于反引号 我尝试了此操作 但是转义的反引号无法按转义的方式工作 regex lt lt hello how are you gt 1 how expected
  • Ruby on Rails link_to 与 put 方法

    我是 Rails 新手 我正在尝试使用 link to 帮助程序创建一个发出 PUT 请求而不是 GET 请求的链接 具体来说 我正在尝试创建一个链接 从管理员面板激活我的应用程序中的用户帐户 我正在使用 Rails 3 0 5 我的rou
  • 带分页的 Rails 随机活动记录

    我需要查找特定资源的所有记录并以随机顺序显示它们 但具有一致的分页 如果开始分页 您将不会看到相同的记录两次 每次用户访问页面时 显示顺序都应该是随机的 我在用将分页 http wiki github com mislav will pag
  • 如何访问“可以?”细胞内的方法?

    我在用着cancan and cells我的 ruby on rails 项目中的 gems 如何访问can 细胞内的方法 Thanks 我必须这样做 尝试 class MyCell lt Cell Rails include CanCan
  • 设计和自定义 Rails 用户 URL

    我目前正在使用 Rails 3 2 5 和最新的 devise gem 目前用户可以访问他们的个人资料页面 example com users john doe 我想删除网址的用户部分 因此网址将是example com john doe
  • Rails 3:用户创建自定义表单?

    我正在尝试思考如何允许用户创建具有所有字段类型的自定义表单 如果有一颗宝石那就太好了 但我似乎无法在任何地方找到它 所以我有一个像这样的数据库设置 t integer form id t string name t string hint
  • 如果数组包含一个或多个相同值,则合并数组

    我有一个数组数组 a 1 2 3 3 4 5 6 7 8 8 9 9 10 我想合并包含一个或多个相同值的所有数组 所以 a 1 2 3 4 5 6 7 8 9 10 我正在努力寻找一种简洁的方法来解决这个问题 有任何想法吗 我相信这是正确
  • 在 RSpec 测试期间抑制控制台输出

    我正在测试在控制台上放置一些消息的类 包含 put p 警告等 我只是想知道在 RSpec 测试期间是否有能力抑制此输出 我压抑puts通过重定向在我的类中输出 stout到一个文本文件 这样 如果我出于任何原因需要查看输出 它就在那里 但
  • 安装 Rails Apartment gem 时出现问题

    当我尝试时出现错误 bundle exec rails generate apartment install 收到此错误 build Apartment Reloader 的未定义方法新 字符串 无方法错误 看起来这是一个中间件问题 任何解
  • 在模型中重复数据以满足在集合中使用迪米特定律是否合适?

    这是一个人为的例子 假设我想列出一个人有朋友的国家的人口 这里有下面两个设置 最好在模型中重复数据吗 有人告诉我得墨忒耳定律 http en wikipedia org wiki Law of Demeter遵循这一点很重要 例如你告诉狗走
  • << 和 += 有什么区别?

    我一直在尝试使用数组 发现自己在理解以下代码时遇到了困难 first array second array third array I initialized 3 empty arrays third array lt lt 1 2 3 4
  • 如何解决“找不到密钥::密码”?

    I m very铁轨已经生锈了 我认为自从我使用它以来的七年里 发生了很多变化 我正在尝试设置这个示例应用程序 https iridakos com news 2015 06 21 rails sample api ui https iri
  • $ bundle exec rake db:reset 命令提升无法删除 db/development.sqlite3

    我试着跑 bundle exec rake db reset并在控制台上发现以下内容 Couldn t drop db development sqlite3
  • 更快地将数据库从一个heroku应用程序传输到另一个应用程序

    有没有更快的方法将我的生产数据库传输到测试应用程序 目前我正在做一个heroku db pull然后到我的本地机器heroku db push app testapp但这变得越来越耗时 我有一些种子数据 但它并不像简单地使用我的真实数据进行
  • PostgreSQL安装错误——无法分配内存

    我正在尝试从 sqlite3 切换到 PostgreSQL 以在 Rails 中进行开发 这样我就不会遇到任何 heroku 问题 我遵循了heroku和链接到的Railscast上给出的建议 但是在brew安装postgresql后遇到了
  • Ruby 中的 Splat 运算符(快速排序示例)

    你好 我正在研究一些 Ruby 代码 在 Ruby 中实现快速排序 1 def qsort lst 2 return if lst empty 3 x xs lst 4 less more xs partition y y lt x 5 q
  • 如何通过Grape API获取路由

    我使用 gem grape 作为 api 我尝试通过命令获取 api urlrake grape routes namespace grape do desc routes task routes gt environment do API
  • Rails 5 - 在 gem 上充当 Taggable - 简单表单集合选择已定义的标签列表

    我正在尝试学习如何将 Acts as Taggable On gem 与 Rails 5 一起使用 我使用简单的表格作为表格 我认为部分问题是由于提案和 randd fields 之间的模型没有关联而产生的 我有名为 Proposal 和
  • 为 Ruby On Rails 环境创建 Docker 映像时出错(从 Dockerfile)

    估计是环境问题 当我手动执行此操作 没有 Dockerfile 时 它可以工作 这是我的 Dockerfile FROM ubuntu 14 04 RUN apt get update RUN apt get upgrade assume
  • ruby 中的树和图数据结构[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我很难找到在 ruby 中使用的树数据结构 我可以研究一些众所周知的吗 我的要求很简单 我想创建一棵树 或者可能是一个图 并找到一些节点之

随机推荐

  • Azure DevOps 服务器上的批处理命令 vcvarsall.bat 出现“输入行太长”错误

    我正在 Azure DevOps 服务器管道上运行批处理文件作为批处理脚本任务 此批处理文件在内部调用英特尔并行工作室编译器 2019 更新 3 如下所示 if ERRORLEVEL NEQ 0 call ICPP COMPILER19 b
  • 如何更改悬停时的文本框内容

    我无法弄清楚如何使文本框根据悬停在哪个链接上来更改内容 我可以让它与最接近 div 的任何一个一起工作 但其他链接似乎没有效果 然而 我不想在链接之间插入文本 也不想创建多个文本框 我的主要目标是让链接始终位于同一位置 当您将鼠标悬停在链接
  • Python 如何处理全局变量?

    我在 Python 中遇到过一些非常奇怪的全局变量处理方式 我希望有人能够解释并证明这些惊喜的合理性 A 此代码按预期打印 10 def func print a a 10 func B 此代码抛出有关过早引用 a 的异常 def func
  • Eclipse 条件调试

    我想知道是否有办法在调试时在 eclipse 中添加条件断点 示例 of city New York 然后中断 是的 右键单击断点 选择 断点属性 启用 条件 然后输入条件 注意city New York 由于 Java 中相等的工作方式
  • 重塑存储在集合中的数组并导出为 CSV

    我有一个 Facebook 页面点赞的集合 标题为页面赞数 存储在 Mongo 数据库 JSON 文件中 以下是一个条目的示例 id ObjectId 4725bf8731b8faf4c04595bb user id 0939bf9w980
  • Bash 中按数字文件名排序的 erge 文本文件

    有没有一种方法可以使用一个 bash 命令按文件名的数字顺序连接多个文本文件 我尝试了这个 但由于某种原因 前三行不按顺序 sort n txt gt all txt 添加这个答案只是因为目前接受的答案建议不好的做法 未来 Hellmar
  • CSS 旋转后 Firefox 中的抗锯齿文本

    所以我读了很多关于旋转文本的当前状态的文章 并且无法在所有浏览器中完美地实现真正的抗锯齿功能 它在 Chrome 中看起来像图片中的第一个框 但在 Firefox 中看起来像第二个锯齿状框 我尝试过最流行的修复程序 包括 webkit ba
  • 获取父级的类型

    给定以下课程 template
  • 无法查询表存储中的日期时间列

    我已使用逻辑应用程序中的 formatDateTime 将一列插入到表存储中 并输入正确的值 并且当我查看记录时 列类型显示为 DateTime 但是 当我尝试查询此字段时 它默认为字符串 即使我将其更改为 DateTime 也不会返回任何
  • 为什么编译 Bootstrap 3 RC1 时会出现 Grunt / Recess 错误,而 Lessc 不会出现错误?

    我向 mixins less 添加一些代码 img extend img responsive 也可以看看 Twitter Bootstrap 3 中的图像默认不响应 and https stackoverflow com a 155732
  • 意图服务在打瞌睡模式下不工作

    我的一位同行开发人员写了一篇intent service进行 API 调用 然后休眠 2 分钟 醒来后 再次发送 下面是代码 public class GpsTrackingService extends IntentService Ove
  • 从 woocommerce 中的电子邮件模板中删除订单信息部分

    我正在尝试删除订单信息已完成订单和客户发票电子邮件的部分 在以下位置找不到如何删除它 wp content plugins woocommerce templates emails customer completed order php
  • 无法修复 Digital Ocean Droplet 上的 NGINX 502:错误网关错误 - Ubuntu 20.04

    我已将我的网站部署到 Digital Ocean Droplet Ubuntu 20 04 服务器 一切都工作正常 今天 我在本地机器上对网站做了一些更改 因此 我将更改推送到 GitHub 然后再次将 GitHub 存储库克隆到服务器 然
  • H2DB和Java,大约>两个小时的差异

    我正在开发一个比赛计时系统 在某些情况下 我需要从 H2DB 检索时间对象 与其兄弟 或姊妹 一样 时间数据类型相对于 1970 年 1 月 1 日 并以 hh mm ss 格式在 SQL 中表示 日期默认设置为 01 01 1970 它默
  • Mysql 查询返回资源 id #8 而不是所需的值[关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 您好 我正在尝试发现如何修复我的查询以返回正确的结果 这是我的查询 selectShoe
  • 使用python基于两个单词的词频统计

    网上有很多资源展示了如何对单个单词进行字数统计 喜欢this and this and this和别的 但我无法找到两个单词计数频率的具体示例 我有一个 csv 文件 其中包含一些字符串 FileList I love TV show ma
  • 通过 Angular.js 维护会话

    我正在使用 AngularJS 框架开展一个项目 我对使用这个框架还很陌生 过去我只使用纯 JavaScript 和 jQuery 该项目是一种针对利基市场的网页设计师应用程序 当用户在设计时在页面之间移动时 我想维护他们所做的所有更改的会
  • Babel 在运行 Jest 时不会编译 .test.js 文件

    运行yarn run jest no cache时 抛出一个错误 内容如下 SyntaxError Unexpected token import 我最好的猜测是 babel 没有达到这个测试文件 我需要将它们包含在 babelrc 中吗
  • 数据库:SUBSTRING 直到字符第一次出现

    我有字符串类型 abc 01 abcd 01 或 02 现在我想要子字符串 即 abc abcd 等 我正在使用 db2 as400 请建议通过 RIGHT 或 LEFT 函数进行处理 使用 POSITION 内置函数 格式为 POSITI
  • method_missing 覆盖不起作用

    我编写了一个方便的 ActiveRecord 扩展来将方法委托给基础对象 基于多表继承 class ActiveRecord Base def self acts as base class eval Q def method missin