如果一切都是ruby中的对象/类,为什么ruby不能告诉我导致错误的类/对象的名称。
undefined method `changed_servings?' for #<#<Class:0x00000009a4fa70>:0x00000009814558>):
我想知道<Class:0x00000009a4fa70>:0x00000009814558>
基本上是什么意思......
答案 0 :(得分:2)
通常,Ruby会给出缺少方法所来自的Class的名称。例如,如果我在irb中并且我创建,实例化,然后调用一个缺少的方法,Ruby会给我比Rails更多的细节。
class Widget
def initialize
@widget = 42
end
end
然后我实例化了这个类:
test = Widget.new
我找回新制作的对象的ID和类名:
#<Widget:0x007f850982f560 @widget=42>
如果我调用一个不属于Widget的方法:
test.no_method
我收到来自irb的好消息:
NoMethodError: undefined method `no_method' for #<Widget:0x007f850982f560 @widget=42>
但是回到Rails ......我不确定具体原因,也许是因为Rails MVC是如何构建的,Classes的实际名称已被省略,并且只有对象ID在错误消息中给出
如果我制作了一个电影应用,并且我在app / views / model / show.html.erb中,我调用了一个不存在的方法,如:
<% no_method %>
我的应用会爆炸,并显示以下消息:
undefined local variable or method `no_method' for #<#<Class:0x007fb9a51553b8>:0x007fb9a4951c48>
我打赌下注第一个ID与Object的Model ID相关,第二个ID是Object的View ID,但我完全猜测了。但是,上面的信息将为您提供错误来自的文件路径,在我的情况下,就在未定义的方法错误消息上方是:
NoMethodError in Movies#index
无论如何,您还可以在View模板中搜索该破解方法,您应该找到它。希望有所帮助。
答案 1 :(得分:0)
假设我们写下以下内容。
class C
end
C.class_method
#=> NoMethodError: undefined method `class_method' for C:Class
c = C.new
#=> #<C:0x007fe12bd1eb10>
c.instance_method
# NoMethodError: undefined method `instance_method' for #<C:0x007fe12bd1eb10>
那里没有惊喜。现在让我们做同样的事情,但动态创建一个匿名类。
klass = Class.new
#=> #<Class:0x007fe12bce5720>
klass.class_method
#=> NoMethodError: undefined method `class_method' for #<Class:0x007fe12bce5720>
k = klass.new
#=> #<#<Class:0x007fe12bce5720>:0x007fe12bcc4fc0>
k.instance_method
#=> NoMethodError: undefined method `instance_method' for
# #<#<Class:0x007fe12bce5720>:0x007fe12bcc4fc0>
你有它!
顺便提一下,您可以动态创建一个类,并为其指定一个名称:
Object.const_set 'C', Class.new
#=> C
现在你可以写
了C.class_method
#=> NoMethodError: undefined method `class_method' for C:Class
C.new.instance_method
#=> NoMethodError: undefined method `instance_method' for #<C:0x007fe12bc766e0>