gpt4 book ai didi

ruby - 什么时候 Ruby 类不是那个 Ruby 类?

转载 作者:数据小太阳 更新时间:2023-10-29 08:29:32 32 4
gpt4 key购买 nike

我的 Rails 应用 Controller 中有这段代码:

  def delete
object = model.datamapper_class.first(:sourced_id => params[:sourced_id])
if object.blank?
render :xml => "No #{resource} with sourced_id #{params[:sourced_id]}", :status => :not_found and return
end
object.destroy
render :xml => "", :status => :no_content
rescue MysqlError => e
puts "raised MysqlError #{e.message}"
render :xml => e.message, :status => :unprocessable_entity and return
rescue Mysql::Error => e
puts "raised Mysql::Error #{e.message}"
render :xml => e.message, :status => :unprocessable_entity and return
rescue Exception => e
puts "not a MysqlError, instead it was a #{e.class.name}"
render :xml => e.message, :status => :unprocessable_entity and return
end

当我运行我的规范以确保我的外键约束有效时,我得到了这个:

not a MysqlError, instead it was a MysqlError

这里可能发生了什么?


一些祖宗资料:当我改救给我这个:

puts MysqlError.ancestors
puts "****"
puts Mysql::Error.ancestors
puts "****"
puts e.class.ancestors

这是我得到的:

Mysql::Error
StandardError
Exception
ActiveSupport::Dependencies::Blamable ...
****
Mysql::Error
StandardError
Exception
ActiveSupport::Dependencies::Blamable ...
****
MysqlError
StandardError
Exception
ActiveSupport::Dependencies::Blamable ...

全局命名空间中是否存在使 MysqlError 类无法访问的别名?

最佳答案

Ruby 类只是对象,因此比较基于对象标识(即,底层的相同指针)。

不确定您的情况发生了什么,但我会尝试在几个位置进行调试并查看您为 MysqlError 获得的对象 ID 和祖先。我怀疑不同模块中有两个这样的对象,而您的 catch 子句引用了错误的对象。

编辑:

这很奇怪。我现在的猜测是 MysqlError 或它的祖先之一已包含在您的 Controller 自己的类链中的两个不同点,这会以某种方式触发异常捕获。

理论 #2 是因为 rails 重新定义了 const_missing 来执行自动请求,所以您期望在异常处理子句中获得 UndefinedConstant 异常的地方反而是在源代码树中的哪个位置找到具有该名称的东西。您应该能够通过测试需要关闭的 auto 来查看是否是这种情况(即在开发和生产模式下进行一些调试)。

有一种语法可以强制您的引用从根目录开始,如果您能找出要引用的正确目录,这可能会有所帮助:

::Foo::Bar

咆哮:

这种事情是我认为 ruby​​ 显示的一些缺陷的地方。在 Ruby 的对象模型和范围内,所有对象结构都相互指向,其方式与 javascript 或其他基于原型(prototype)的语言非常相似。但这在您在该语言中使用的类/模块语法中表现得不一致。似乎通过一些仔细的重构,您可以使这些东西更清晰并简化语言,尽管这当然会与现有代码高度不兼容。

提示:

当使用 puts 进行调试时,尝试执行 puts foo.inspect,因为这将以您在 irb 中习惯的方式显示它。

关于ruby - 什么时候 Ruby 类不是那个 Ruby 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1134752/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com