我稍后在添加本地化时是否需要考虑?
这 类文章 field:title,type:String 至 类文章 field:title,type:String,localize:true
我在Articles
模型上有内容,并希望随后添加本地化。
现在我发现有时内容会显示为哈希
{"en"=>"asdfasdf", "de"=>"123123123"}
有时作为普通文字。
如果我通过
显示文章@article.title
# I get --> no implicit conversion from nil to integer
@article.title_translations
# I get --> no implicit conversion from nil to integer
如果文档未翻译,则会发生这种情况。 (字符串)。
此外,如果我尝试更改内容,我会遇到问题:
article.title # "en"
article.title_translations # "Test Title"
article.update_attribute(:name, c.name_translations)
# raises NoMethodError: undefined method `merge!' for "Test Title":String
article.name = c.title_translations
# raises NoMethodError: undefined method `merge!' for "Test Title":String
答案 0 :(得分:4)
如果文档未翻译并且您尝试访问此字段,则会引发错误:
no implicit conversion from nil to integer
如果您尝试更改它,则会引发错误:
raises NoMethodError: undefined method `merge!' for "Test Title":String
这似乎是一个mongoid bug。现在,您可以在添加'localize:true'后执行此操作:
I18n.locale = :en
Article.all.each do |article|
begin
article.title
rescue
b = article.attributes['title']
article.unset('title')
article.title = b
article.save
end
end
它为我提供了诀窍。
答案 1 :(得分:1)
翻译内部通过哈希处理
{ "en" => "book", "de" => "Buch" }
我已经使用了
Article.each do |article|
article.title_translations = {"en" => article.title_translations}
article.save!
end
谢谢Durden先生:
答案 2 :(得分:1)
如果之前的解决方案引发异常,我就是这样做的:
Article.all.each do |article|
value = article.attributes['title'].try(:clone)
unless value.is_a?(Hash)
Article.collection.where({ _id: article._id }).update({
"$set" => {
"title" => I18n.available_locales.inject({}) do |m, l|
m[l.to_s] = v
m
end
}
})
end
end