Ruby on rails 为什么从固定装置加载的Rails数据被破坏?
我有两个地区和翻译的固定文件。 区域设置加载正常,但翻译中断: 固定装置Ruby on rails 为什么从固定装置加载的Rails数据被破坏?,ruby-on-rails,fixtures,Ruby On Rails,Fixtures,我有两个地区和翻译的固定文件。 区域设置加载正常,但翻译中断: 固定装置 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: "con
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>
翻译模式
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
在translations.yml中,所有locale键值设置为locale_00016
translation_05064:
id: 5064
key: control.base_search_users.panel.title
value: Поиск пользователей
locale: locale_00016
is_proc: false
是的,这很有效强>
翻译id引用了现有且正确的语言环境记录,但语言环境仍然为零,为了修复它,我运行了
Locale.find\u by\u code('ru')。translations.update\u all(:Locale=>'ru')
如果设置了Locale\u id
,则看起来还可以<代码>区域设置将在您需要时由Rails填充(第一次请求时)。1019186233是创建装置时rais生成的id
大多数情况下,您不需要在fixture中指定id,rails会为您生成id,因此下面这样的fixture应该可以(您不应该在翻译fixture中同时定义locale
和locale\u id
):
locales.yml:
locale_00016:
id: 16
code: ru
name: Русский
翻译.yml:
如果你在固件中删除空白<代码>插补< /代码>,还有问题吗?这可能会引起问题。您可以删除它或将其设置为
”
我尝试了这两种方法,删除插值行并指定空值“”。这并没有解决问题,但查看日志,我发现如果我从yml文件中删除插值行,插入中没有区域设置字段。我感到很困惑<代码>夹具插入(1.5ms)插入“翻译”(“id”、“key”、“value”、“locale\u id”、“is\u proc”)值(5502,“sites.index.title”、“Сааааааы”,1019186233,“f”)如果我从yml文件中删除插值和locale\u id行,locale\u id仍会出现在日志中。Rails自己添加了它:Fixture Insert(0.9ms)插入到“translations”(“id”、“key”、“value”、“is_proc”、“locale_id”)值中(5503,“sites.menu.index”、“Саааааааафф”、“f”、“1019186233;”中)
问题是,区域设置记录获得的id值与fixtures yml文件中的id值。因此,在从yml fixture加载之后,所有应该属于Translation.find(16)的翻译都不属于任何现有的语言环境,而是属于不存在的语言环境。find(1019186233)。为什么?我觉得我没听清楚你的解释,好像我错过了一些非常重要的东西basic@zuba你有没有试着从区域设置和fixture中的翻译中删除id?我很抱歉回答晚了,Baldrick。我试图从yaml夹具文件中删除Locale.id、Translation.id和Translation.Locale\u id。加载后,Translation.location\u id具有所有记录的保存值,但该值与任何区域设置id都不匹配。此外,出于某种原因,Translation.Locale为nil,尽管在yaml文件中为“ru”。我想这是因为Fixture将名为locale的属性识别为对预期命名为ru的特定语言环境记录的命名引用。
locale_00016:
id: 16
code: ru
name: Русский
translation_05064:
id: 5064
key: control.base_search_users.panel.title
value: Поиск пользователей
locale: locale_00016
is_proc: false
ru:
what_ever_attr: value
...
ru_title_translation:
key: control.base_search_users.panel.title
value: Поиск пользователей
interpolations:
locale: ru
is_proc: false