0

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.8PostgreSql-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')

4

1 に答える 1

1

locale_idが設定されていれば問題ないようです。locale必要なときに Rails によって入力されます (最初に要求するとき)。1019186233 は、フィクスチャの作成時に rais によって生成される ID です。

ほとんどの場合、フィクスチャで ID を指定する必要はなく、Rails が ID を生成するため、以下のようなフィクスチャで問題ありません ( Translation フィクスチャでlocaleとの両方を定義しないでください)。locale_id

locales.yml:

ru:
  what_ever_attr: value
  ...

translations.yml:

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