0

我想在記錄上使用update_attributes,但它失敗了,我找不到原因,我必須丟失一些明顯的東西,因爲我已經使用過該方法大量的時間。Rails`update_attributes`未定義的方法第一個爲零:NilClass

我想爲其名稱變量使用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失敗:

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 
+0

我認爲這可能是問題(http://stackoverflow.com/questions/9496816/ruby-on-rails-with-globalize3-find-by-translated-field-makes-record-readonly?rq=1 ),但我的記錄似乎是可寫的。 – mbillard

+1

更多的堆棧跟蹤將有所幫助。 「第一」被稱爲「哪裏」?它在你的代碼中?通過'Globalize3'?在鐵軌? – gregates

+0

同意@gregates。您向我們展示的錯誤與在無對象上使用對'第一個'方法的調用有關。在您的示例中,我看不到「第一個」的呼叫。全堆棧跟蹤,更多代碼,或兩者請? – coderjoe

回答

1

我終於找出了使用蹤跡。

事實證明,我的自定義方法with_locale也由globalize3定義,並導致各種問題。

感謝@cthulhu,我找到了約I18n.with_locale,並用它來代替。

+1

很酷,我正準備發佈!很高興我們可以(有點)幫助 – gregates

+1

順便說一句,有一種方法I18n.with_locale可以完成與您的方法相同的功能,那麼爲什麼不使用它呢? – cthulhu

+0

@gregates你肯定幫了忙,我沒有想過如果沒有你就使用'trace',我不知道爲什麼,因爲我通常這麼做。 @cthulhu我沒有意識到這種方法,我會用它來擺脫我的。 – mbillard

相關問題