簡體   English   中英

為什么從Fixtures加載的Rails數據損壞了?

[英]Why Rails data loaded from Fixtures are broken?

我有兩個關於“語言環境”和“翻譯”的Fixture文件。 語言環境可以很好地加載,但是翻譯會被破壞:

治具

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中看到包含損壞的數據。 當我將夾具文件加載到YAML.load_file 'test/fixtures/translations.yml' rails concl中時,我得到了正確的哈希數據。

為什么會這樣? 如何解決? 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引用了現有的正確的Locale記錄,但是語言環境仍然為零,要修復它,我運行Locale.find_by_code('ru').translations.update_all(:locale => 'ru')

如果設置了locale_id ,看起來還可以; 需要時(第一次請求時),Rails將填充locale 1019186233是rais在創建固定裝置時生成的ID。

大多數時候,您不需要在固定裝置中指定ID,Rails會為您生成ID,因此,如下所示的固定裝置就可以了(您不應在Translation固定裝置中同時定義localelocale_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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM