奇怪的类名称的未定义方法错误

时间:2017-04-15 01:53:45

标签: ruby-on-rails ruby runtime-error actionview

如果一切都是ruby中的对象/类,为什么ruby不能告诉我导致错误的类/对象的名称。

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

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

2 个答案:

答案 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>