0

我有两个用于区域设置和翻译的固定文件。语言环境加载正常,但翻译被破坏:

夹具

translation_05064:
  id: 5064
  key: control.base_search_users.panel.title
  value: Поиск пользователей
  interpolations: 
  locale: ru
  locale_id: 16
  is_proc: false

成为记录:

#<Translation id: 5064, 
key: "control.base_search_users.panel.title", 
value: "Поиск пользователей", 
interpolations: nil, 
locale: nil, 
locale_id: 1019186233, 
is_proc: false>

出于某种原因, locale而不是'ru'变为 nil,而locale_ib而不是16变为1019186233对于文件中的每个夹具。

我以这种方式加载固定装置:

require 'active_record/fixtures'
ActiveRecord::Fixtures.reset_cache  
fixtures_folder = File.join(Rails.root, 'test', 'fixtures')
fixtures = Dir[File.join(fixtures_folder, '*.yml')].map {|f| File.basename(f, '.yml') }
ActiveRecord::Fixtures.create_fixtures(fixtures_folder, fixtures)

翻译模型

class Translation < ActiveRecord::Base
  validates :key, :uniqueness => {:scope => :locale_id}
  validates :key, :locale, :locale_id, :value, :presence => true
  belongs_to :locale
  attr_accessible :key, :value, :locale_id, :locale
end

迁移

  class CreateTranslations < ActiveRecord::Migration
    def change
      create_table :translations do |t|
        t.string  :key
        t.text    :value
        t.text    :interpolations
        t.string  :locale
        t.integer :locale_id
        t.boolean :is_proc, :default => false
      end
      add_index :translations, [:key, :locale]
    end
  end

我在插入到数据库的 test.log 中看到包含损坏的数据。当我在 rails concole 中加载夹具文件时,YAML.load_file 'test/fixtures/translations.yml'我得到了正确的哈希数据。

为什么会这样?如何解决? Rails-2.3.8 , PostgreSql-8.4


更新: 尝试命名固定装置。在 locales.yml 中:

locale_00016:
  id: 16
  code: ru
  name: Русский

并在 translations.yml 中将所有语言环境键值设置为 locale_00016

translation_05064:
  id: 5064
  key: control.base_search_users.panel.title
  value: Поиск пользователей
  locale: locale_00016
  is_proc: false

是的,这行得通!

翻译id引用了现有且正确的语言环境记录,但语言环境仍然为零,为了修复它我跑了Locale.find_by_code('ru').translations.update_all(:locale => 'ru')

4

1 回答 1

1

如果locale_id设置了,看起来还可以;locale将在您需要时由 Rails 填充(第一次请求时)。1019186233是rais在创建fixture时生成的id。

大多数时候,您不需要在夹具中指定 id,rails 会为您生成它们,所以像下面这样的夹具应该没问题(您不应该在 Translation 夹具中同时定义locale和定义):locale_id

locales.yml:

ru:
  what_ever_attr: value
  ...

翻译.yml:

ru_title_translation:
  key: control.base_search_users.panel.title
  value: Поиск пользователей
  interpolations: 
  locale: ru
  is_proc: false
于 2012-10-25T15:26:31.623 回答