正如标题描述的那样,我在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_region
和nil
中的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.3
和Ruby 1.8.7
上运行的一些遗留代码。
非常感谢任何帮助,谢谢。
---更新---
在使用region
运行视图时访问控制台中的<% debugger %>
对象后,我尝试使用region.class.instance_methods - ActiveRecord::Base.instance_methods
基本上查找可从region
实例访问哪些实例方法并且不是源于ActiveRecord::Base
的人
结果:
=> []
.....................显然零实例方法不是从ActiveRecord::Base
继承的方法。神秘感加深了。