1

我的 ruby​​ on rails 应用程序有问题。每当遇到未定义的方法时,它都会使用过多的内存。它冻结服务器,直到我终止进程。错误日志指向未定义的方法,该方法类似于以下内容:

ActionView::Template::Error(#<#:0x007fb3d88de8c8> 的未定义方法 `testos'):

有什么方法或配置可以解决这个问题吗?我在 rails 3.2.2 上使用 ruby​​ 1.9.3。

这是堆栈跟踪

在 53960 毫秒内完成 500 内部服务器错误

ActionView::Template::Error( _app_views_rules_index_html_erb_ 4146358986539966513_70205169705180' app/views/rules/index.html.erb:77:in _app_views_rules_index_html_erb _4146358986539665131_8002' 中的未定义方法块testos' for #<#<Class:0x007fb3d43d0420>:0x007fb3d479c8d8>): 77: @rules["data"].each do |rule| 78: json_rule =ActiveSupport::JSON.decode(rule["json_rule"])
79: %>
80: <%=testos(1)%>
81: <div class="dvGridRow" style="width:100%;padding-bottom:10px;">
82: <div class="dvGridData" style="vertical-align:top;width:190px;margin-left:5px;">
83: <%= json_rule["rule_name"]%>
app/views/rules/index.html.erb:80:in

each'
app/views/rules/index.html.erb:77:in

渲染 /Users/jay/.rvm/gems/ruby-1.9.3-p194/gems/actionpack-3.2.2/lib/action_dispatch/middleware/templates/rescues/_trace.erb (6.4ms) 缓存:[GET /manage /rules] 错过渲染 /Users/jay/.rvm/gems/ruby-1.9.3-p194/gems/actionpack-3.2.2/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.8ms) 渲染/救援/布局中的用户/jay/.rvm/gems/ruby-1.9.3-p194/gems/actionpack-3.2.2/lib/action_dispatch/middleware/templates/rescues/template_error.erb (18.5ms)

注意:我故意调用了一个未识别的方法,因为我试图找出我的代码在哪里冻结了机器,并且该错误导致了它。

谢谢

4

1 回答 1

0

一个问题(和一个解决方案)

假设您使用 Ruby 对象。并且假设您对这个对象并不完全熟悉。假设您调用了一个对象上不存在的方法。

o = Object.new  
o.some_method  

NoMethodError:未定义的方法“some_method”用于#

这不太理想,所以 Ruby 有一种很棒的方法可以让我们摆脱这种情况。看一下这个:

class OurClass  
  def method_missing (method_name)  
    puts "there's no method called '#{method_name}'"  
  end  
end  
o = OurClass.new  
o.some_method 

=> 没有名为“some_method”的方法

我们可以在我们的类中创建一个名为 method_missing 的方法。如果我们调用该方法的对象没有该方法(并且没有从另一个类或模块继承该方法),Ruby 将给我们更多机会做一些有用的事情:如果该类有一个 method_missing 方法,我们会将有关方法 cal 的信息交给 method_missing 并让它解决问题。好吧,那太好了;我们不再收到错误消息。

从此链接参考 http://net.tutsplus.com/tutorials/ruby/ruby-for-newbies-missing-methods/

于 2012-10-09T09:12:21.967 回答