NoMethodError:方法存在时对正确类的未定义方法

时间:2016-08-24 09:54:38

标签: ruby-on-rails ruby

正如标题描述的那样,我在Rails中遇到错误,它在一个类的实例上抛出NoMethodError,其中方法实际上存在。

NoMethodError in My#payroll_charts

Showing app/views/my/payroll_charts.rhtml where line #9 raised:
undefined method `service_managers' for #<Region:0x7f6cab0243a0>

正如您所看到的,这不适用于NilClass并且是我想要的类的实例,Region类。

导致视图错误的确切代码是:

app/views/my/payroll_charts.rhtml

<% region = @login.real_region %>
<% if region %>
  <% @service_managers = region.service_managers %>
<% else %>
  <% @service_managers = Region.service_managers %>
<% end %>

最后,这是Region类:

app/models/region.rb

class Region < ActiveRecord::Base

#... skiping lines for brevity ...

def service_managers
  return self.service_mgrs.collect(&:staff).compact
end

#... brevity ...

class << self
  #... other class methods ...
  def service_managers
    r = Region.find(:all)
    return r.collect(&:service_mgrs).flatten.collect(&:staff).compact
  end
  #... other class methods ...
end

正如您所看到的,该方法有两个版本,第一类和实例一。
类级方法可以工作,例如,视图代码不会抛出错误,视图会在@login.real_regionnil中的Region.service_managers运行时呈现。 它是找不到的实例级方法。

仅供参考@login对象是Staff类的实例,real_region指向Region类:

app/models/staff.rb:

has_one :real_region, :class_name => "Region"

我尝试过的事情:

  • 我已经找了项目中可能已经重新开放但没有找到任何内容的其他地方
  • 我也在不同的模块中查找了不同的Region类,我也没找到。
  • 使用region在视图运行时访问控制台中的<% debugger %>对象,但仍然无法访问service_managers方法
  • 在运行region.methods时检查方法是否存在,但它没有
  • 交换region.rb中类和实例级方法的顺序,以防它们相互干扰,无需更改
  • 多台服务器重启
  • 重命名所有实例中的两个方法,使它们的名称不相同
  • 删除整个region.rb并重新添加(仅在未检测到更改的情况下)
  • 计算机重启
  • 删除class << self并将其中的所有方法重命名为self.method_name,以确保class << self按预期正常工作
  • 我现在可能记不起的其他一些事情

这完全来自Rails 1.2.3Ruby 1.8.7上运行的一些遗留代码。

非常感谢任何帮助,谢谢。

---更新---

在使用region运行视图时访问控制台中的<% debugger %>对象后,我尝试使用region.class.instance_methods - ActiveRecord::Base.instance_methods基本上查找可从region实例访问哪些实例方法并且不是源于ActiveRecord::Base的人 结果:

=> []

.....................显然零实例方法不是从ActiveRecord::Base继承的方法。神秘感加深了。

0 个答案:

没有答案