2017-04-15 37 views
1

如果一切都是一个对象/类在Ruby中,为什么不能告诉我一个类/对象导致错误的名称。未定义的方法错误与奇怪的类名

undefined method `changed_servings?' for #<#<Class:0x00000009a4fa70>:0x00000009814558>): 

我想知道什么<Class:0x00000009a4fa70>:0x00000009814558>基本上意味着...

+1

告诉我们,导致此错误的代码。 –

+2

这通常是使用'Class.new'从一些动态创建的类引发的,并且不需要将类绑定到某个常量(命名该类)。 –

回答

2

通常情况下,红宝石将给类缺少方法是从的名称。例如,如果我在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 

在任何情况下,你也可以做一个搜索在你的视图模板中,你可以找到它。希望有所帮助。

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>