如果一切都是一个对象/类在Ruby中,为什么不能告诉我一个类/对象导致错误的名称。未定义的方法错误与奇怪的类名
undefined method `changed_servings?' for #<#<Class:0x00000009a4fa70>:0x00000009814558>):
我想知道什么<Class:0x00000009a4fa70>:0x00000009814558>
基本上意味着...
如果一切都是一个对象/类在Ruby中,为什么不能告诉我一个类/对象导致错误的名称。未定义的方法错误与奇怪的类名
undefined method `changed_servings?' for #<#<Class:0x00000009a4fa70>:0x00000009814558>):
我想知道什么<Class:0x00000009a4fa70>:0x00000009814558>
基本上意味着...
通常情况下,红宝石将给类缺少方法是从的名称。例如,如果我在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是如何architectured,各阶级的实际名称已经离开out,并且只有对象ID在错误消息中给出。
如果我已经拍了一部电影的应用程序,我在app /视图/模型/ show.html.erb和我所说的方法不存在这样的:
<% no_method %>
我的应用程序将爆炸,以下消息:
undefined local variable or method `no_method' for #<#<Class:0x007fb9a51553b8>:0x007fb9a4951c48>
我敢打赌第一ID绑定到该对象的模型ID,第二个是对象的视图ID的赌注,但我完全猜一下。但它的邮件上方的信息会给你来自的错误,在我的情况的文件路径,只是未定义的方法错误信息上面:
NoMethodError in Movies#index
在任何情况下,你也可以做一个搜索在你的视图模板中,你可以找到它。希望有所帮助。
假设我们编写以下内容。
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>
告诉我们,导致此错误的代码。 –
这通常是使用'Class.new'从一些动态创建的类引发的,并且不需要将类绑定到某个常量(命名该类)。 –