Mongoid字段并随后添加本地化

时间:2014-01-12 16:22:00

标签: ruby-on-rails-3 localization ruby-on-rails-3.2 mongoid mongoid3

我稍后在添加本地化时是否需要考虑?

这     类文章     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

问题

  • 如何正确地将字符串字段更改为“String,:localize => true”?
  • 是否有要反映的脚本或其他内容?

3 个答案:

答案 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先生:

https://github.com/mongoid/mongoid/issues/3488

答案 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