Rails`update_attributes`未定义的方法`first` for nil:NilClass

时间:2012-09-25 14:33:13

标签: ruby-on-rails ruby-on-rails-3 update-attributes globalize3

我正在尝试在记录上使用update_attributes,但它失败了,我无法弄清楚为什么,我必须遗漏一些明显的东西,因为我已经多次使用该方法。

我正在尝试为使用Globalize3作为名称变量的模型播种数据。

class City < ActiveRecord::Base
  attr_accessible :name

  translates :name
end

请注意,City没有名为name的列。

在控制台中我执行city.update_attributes(name: "new name")之类的操作时没有任何问题,但以下代码(seeds.rb)始终以Undefined method for nil:NilClass {<1}}失败:

localized_cities_attributes = [
  { en: { name: "New York City" }, fr: { name: "New York" } },
  { en: { name: "Montreal" }, fr: { name: "Montréal" } }
]
localized_cities_attributes.each do |city_localized_attributes|
  city = nil

  city_localized_attributes.each do |locale, attributes|
    with_locale(locale) do
      if city
        city.update_attributes(name: attributes[:name])
      elsif (city = City.find_by_name(attributes[:name])).nil?
        city = City.create(attributes)
      end
    end
  end
end

with_locale定义如下:

def with_locale(new_locale, &block)
  return if block.nil?

  locale_to_restore = I18n.locale
  I18n.locale = new_locale
  block.call
  I18n.locale = locale_to_restore
  nil
end

1 个答案:

答案 0 :(得分:1)

我终于使用了跟踪。

事实证明我的自定义方法with_locale也是由globalize3定义的,并引发了各种各样的问题。

感谢@cthulhu,我发现了I18n.with_locale并使用了它。