嵌套资源has_one中的未定义方法

时间:2014-09-23 08:03:35

标签: ruby-on-rails ruby-on-rails-4

我使用的是rails 4.02。 (strong_params)

3个型号:

class Region < ActiveRecord::Base
  has_many :cities
end

class City < ActiveRecord::Base
  has_one :location
end

class Location < ActiveRecord::Base
  belongs_to :city
end

查看:

- @region.cities.each do |city|
  %ol
    %li
      %h4.block-title-5
        = link_to city.name, country_region_city_path(city.region.country, city.region, city)
      %p
        = city.city_h2
      %p
        = city.location.latitude

我收到错误消息undefined method "latitude"

这是完整的痕迹:

activerecord (4.0.3) lib/active_record/relation/delegation.rb:13:in each' activerecord 
(4.0.3) lib/active_record/relation/delegation.rb:13:in each' actionpack (4.0.3) 
lib/action_view/template.rb:143:in block in render' activesupport (4.0.3) 
lib/active_support/notifications.rb:161:in instrument' actionpack (4.0.3) 
lib/action_view/template.rb:141:in render' actionpack (4.0.3) 
lib/action_view/renderer/template_renderer.rb:49:in block (2 levels) in render_template' 

我在这里做错了什么?感谢

1 个答案:

答案 0 :(得分:1)

如果您的Location模型确实具有latitude属性,则此错误的最可能原因是您的数据库中有一些City条记录的值为{{1 }}。您可以通过查看完整的异常消息来检查是否是这种情况,是否类似于?:

location

在这种情况下,您有两种选择,具体取决于您是否将NoMethodError: undefined method `latitude' for nil:NilClass 视为latitude模型的必需属性。如果需要,则通过向City模型添加验证规则来强制执行该规则:

City

并且可能是对数据库模式中的外键列的非null约束。

或者,如果您的应用程序中允许缺少validates :location, presence: true 值,则只需处理视图中的缺失值:

latitude