Locales と Translations の 2 つのフィクスチャ ファイルを取得しました。ロケールは正常にロードされますが、翻訳は壊れています:
備品
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>
何らかの理由で、 'ru' の代わりにlocaleが nil になり、16の代わりにlocale_ibがファイル内のすべてのフィクスチャで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
DB への挿入に壊れたデータが含まれている 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は既存の正しいロケール レコードを参照していましたが、ロケールはまだ nil でした。修正するために実行しましたLocale.find_by_code('ru').translations.update_all(:locale => 'ru')